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

📅  最后修改于: 2021-01-12 01:05:32             🧑  作者: Mango

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

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

尽管如此,我们仍在使用UserResource ,它与内存对话。现在,我们将创建一个新的UserResource,它将与嵌入式数据库对话。让我们创建一个新的用户资源。

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

步骤2:现在,我们有两个具有相同名称的URI,它们会产生冲突。要消除此冲突,我们将在UserJPAResource.java文件中添加/ jpa。

UserJPAResource.java

package com.javatpoint.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 retriveAllUsers()
{
return service.findAll();
}
@GetMapping("/jpa/users/{id}")
public Resource 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 resource=new Resource(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 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.javatpoint.server.main.user;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository
{

}

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

@Autowired
private UserRepository userRepository;

步骤5:返回所述userRepository.findAll()在retriveAllUsers()方法。

@GetMapping("/jpa/users")
public List 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 retriveAllUsers()
{
return userRepository.findAll();
}

在以下服务中,无论user为null还是非null ,findById()都会返回User的Option。每当我们使用findById()时,就有两种可能性: id存在或不存在。当它不存在时,它带有一个适当的对象。我们将通过if(!user.isPresent())语句检查用户是否存在。如果用户不存在,则会引发异常。

@GetMapping("/jpa/users/{id}")
public Resource retriveUser(@PathVariable int id)
{
Optional user= userRepository.findById(id);
if(user.isPresent())
//runtime exception
throw new UserNotFoundException("id: "+ id);
//"all-users", SERVER_PATH + "/users"
//retrieveAllUsers
Resource resource=new Resource(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"
}
}
}