更新用户资源的GET方法以使用JPA

在这个主题中,我们将创建一个用于检索所有用户的服务。

目前,我们还在使用UserResource,它与内存通信。现在,我们将创建一个新的UserResource,它将与内嵌数据库通信。让我们创建一个新的用户资源。

步骤1: 复制UserResource.java文件,并将其粘贴到用户包中。将其重命名为UserJPAResource。

UserJPAResource.java

package cn.javatiku.server.main.user;  
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*;  
import java.net.URI;  
import java.util.List;  
import javax.validation.Valid;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.hateoas.Resource;  
import org.springframework.hateoas.mvc.ControllerLinkBuilder;  
import org.springframework.http.ResponseEntity;  
import org.springframework.web.bind.annotation.DeleteMapping;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestBody;  
import org.springframework.web.bind.annotation.RestController;  
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;  
@RestController  
public class UserJPAResource   
{  
@Autowired  
private UserDaoService service;  
@GetMapping("/jpa/users")  
public List<User> retriveAllUsers()  
{  
return service.findAll();  
}  
@GetMapping("/jpa/users/{id}")  
public Resource<User> retriveUser(@PathVariable int id)  
{  
User user= service.findOne(id);  
if(user==null)  
//runtime exception  
throw new UserNotFoundException("id: "+ id);  
//"all-users", SERVER_PATH + "/users"  
//retrieveAllUsers  
Resource<User> resource=new Resource<User>(user);   //constructor of Resource class  
//add link to retrieve all the users  
ControllerLinkBuilder linkTo=linkTo(methodOn(this.getClass()).retriveAllUsers());  
resource.add(linkTo.withRel("all-users"));  
return resource;  
}  
//method that delete a user resource  
@DeleteMapping("/jpa/users/{id}")  
public void deleteUser(@PathVariable int id)  
{  
User user= service.deleteById(id);  
if(user==null)  
//runtime exception  
throw new UserNotFoundException("id: "+ id);  
}  
//method that posts a new user detail and returns the status of the user resource  
@PostMapping("/jpa/users")  
public ResponseEntity<Object> createUser(@Valid @RequestBody User user)     
{  
User sevedUser=service.save(user);    
URI location=ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(sevedUser.getId()).toUri();  
return ResponseEntity.created(location).build();  
}  
}  

但实际上它还没有与数据库通信。我们需要创建一个Spring数据存储库。

步骤3: 创建一个名为UserRepository的接口,该接口扩展了JpaRepository。指定要管理的实体。我们已经指定了User和Integer。现在我们有了UserRepository。

UserRepository.java

package cn.javatiku.server.main.user;  
import org.springframework.data.jpa.repository.JpaRepository;  
import org.springframework.stereotype.Repository;  
@Repository  
public interface UserRepository extends JpaRepository<User, Integer>  
{  
  
}  

步骤4: 在UserJPAResource类中,使用@Autowired将UserRepository接口自动装配进来。

@Autowired  
private UserRepository userRepository;  

步骤5: 在retriveAllUsers()方法中返回userRepository.findAll()

@GetMapping("/jpa/users")  
public List<User> retriveAllUsers()  
{  
return userRepository.findAll();  
}  

retriveAllUsers()是唯一一个从内嵌数据库检索数据的方法,所有其他方法都从静态数组列表中检索数据。

步骤6: 打开Postman。输入URI http://localhost:8080/jpa/users 并发送一个GET请求。它会显示从内嵌数据库获取的所有数据。
restful-web-services-get-method.png

再次发送一个带有URL http://localhost:8080/jpa/users/1GET请求。它返回指定的用户id,即1,但它从内存中获取数据。

但是我们需要从内嵌数据库中获取数据。我们需要更改UserJPAResource.java中的以下服务。

@GetMapping("/jpa/users/{id}")  
public Resource<User> retriveUser(@PathVariable int id)  
{  
Optional<User> user= userRepository.findById(id);  
if(user.isPresent())  
//runtime exception  
throw new UserNotFoundException("id: "+ id);  
//"all-users", SERVER_PATH + "/users"  
//retrieveAllUsers  
Resource<User> resource=new Resource<User>(user.get()); //constructor of Resource class  
//add link to retrieve all the users  
ControllerLinkBuilder linkTo=linkTo(methodOn(this.getClass()).retriveAllUsers());  
resource.add(linkTo.withRel("all-users"));  
return resource;  
}  

再次发送一个带有URL http://localhost:8080/jpa/users/1GET请求。它返回指定的用户以及链接到/jpa/users

{  
"name": "John",  
"dob": "2019-10-01"T0726:52.596+0000",  
"_links": {  
"all-users": {  
"href": "http://localhost:8080/jpa/users"  
}  
}  
}  

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot技术, 习指南