SpringBoot教程-更新用户资源的GET方法以使用JPA
更新用户资源的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请求。它会显示从内嵌数据库获取的所有数据。
再次发送一个带有URL http://localhost:8080/jpa/users/1
的GET请求。它返回指定的用户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/1
的GET请求。它返回指定的用户以及链接到/jpa/users。
{
"name": "John",
"dob": "2019-10-01"T0726:52.596+0000",
"_links": {
"all-users": {
"href": "http://localhost:8080/jpa/users"
}
}
}