在本主题中, 我们将创建一个检索所有用户的服务。
尽管如此, 我们仍在使用UserResource, 它与内存对话。现在, 我们将创建一个新的UserResource, 它将与嵌入式数据库对话。让我们创建一个新的用户资源。
步骤1:复制UserResource.java文件并将其粘贴到用户包中。用UserJPAResource重命名。
步骤2:现在, 我们有两个具有相同名称的URI, 它们会产生冲突。要消除此冲突, 我们将在UserJPAResource.java文件中添加/ jpa。
UserJPAResource.java
package com.srcmini.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;
@RestControllerpublic class UserJPAResource {@Autowiredprivate 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 exceptionthrow new UserNotFoundException("id: "+ id);
//"all-users", SERVER_PATH + "/users"//retrieveAllUsersResource<
User>
resource=new Resource<
User>
(user);
//constructor of Resource class//add link to retrieve all the usersControllerLinkBuilder 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 exceptionthrow 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。指定必须管理的实体。我们指定了用户和整数。现在我们已经准备好UserRepository。
UserRepository.java
package com.srcmini.server.main.user;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repositorypublic interface UserRepository extends JpaRepository<
User, Integer>
{}
步骤4:创建UserResource的使用。我们已经自动连接了UserJPAResource类中的UserRepository接口。
@Autowiredprivate UserRepository userRepository;
步骤5:在retriveAllUsers()方法中返回userRepository.findAll()。
@GetMapping("/jpa/users")public List<
User>
retriveAllUsers(){return userRepository.findAll();
}
retriveAllUsers()是从嵌入式数据库检索数据的唯一方法, 所有其他方法都从静态数组列表中检索数据。
步骤6:打开邮递员。输入URI http:// localhost:8080 / jpa / users并发送GET请求。它显示了从嵌入式数据库获取的所有数据。
文章图片
再次发送带有URL http:// localhost:8080 / jpa / users / 1的GET请求。它返回指定的用户ID(即1), 但它从内存中提取数据。
但是我们需要从嵌入式数据库中获取数据。我们需要在UserJPAResource.java中更改以下服务。
@GetMapping("/jpa/users")public List<
User>
retriveAllUsers(){return userRepository.findAll();
}
在以下服务中, 无论user为null还是非null, findById()都会返回User的Option。每当我们使用findById()时, 就有两种可能性:id存在或不存在。如果不存在, 它将带有一个适当的对象。我们将通过if(!user.isPresent())语句检查用户是否存在。如果用户不存在, 则会引发异常。
@GetMapping("/jpa/users/{id}")public Resource<
User>
retriveUser(@PathVariable int id){Optional<
User>
user= userRepository.findById(id);
if(user.isPresent())//runtime exceptionthrow new UserNotFoundException("id: "+ id);
//"all-users", SERVER_PATH + "/users"//retrieveAllUsersResource<
User>
resource=new Resource<
User>
(user.get());
//constructor of Resource class//add link to retrieve all the usersControllerLinkBuilder linkTo=linkTo(methodOn(this.getClass()).retriveAllUsers());
resource.add(linkTo.withRel("all-users"));
return resource;
}
【更新用户资源上的GET方法以使用JPA】再次发送带有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"}}}
推荐阅读
- 使用Spring Boot初始化RESTful Web服务项目
- 为所有资源实现通用异常处理
- 使用自定义注释增强Swagger文档
- 为RESTful服务实现动态过滤
- 内容协商实现对XML的支持
- 实现DELETE方法删除用户资源
- 执行POST服务为用户创建帖子
- RESTful Web服务最佳实践
- JAX-RS教程介绍