个性化阅读
专注于IT技术分析

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

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

尽管如此, 我们仍在使用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;
@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。指定必须管理的实体。我们指定了用户和整数。现在我们已经准备好UserRepository。

UserRepository.java

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

}

步骤4:创建UserResource的使用。我们已经自动连接了UserJPAResource类中的UserRepository接口。

@Autowired
private 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请求。它显示了从嵌入式数据库获取的所有数据。

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

再次发送带有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 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"
}
}
}

赞(0)
未经允许不得转载:srcmini » 更新用户资源上的GET方法以使用JPA

评论 抢沙发

评论前必须登录!