如何使用@patch使用jpa存储库更新单个字段



我正在通过spring-boot开发一个简单的应用程序。我需要限制用户只能更新名称,而不是所有与用户数据相关的字段,但不幸的是,我的代码有一个问题,如果有人以Json格式发送数据并更改年龄或任何其他字段,它将被更新,但正如我所说,我需要用户能够更改唯一的名称,而不能更改任何其他字段。我必须提到我正在使用JPA存储库和春季数据

我的控制器

@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
StudentRepository repository;
// method i user to only update the name field
@PatchMapping("/pattt/{id}")
public ResponseEntity partialUpdateName(
@RequestBody Student partialUpdate, 
@PathVariable("id") String id 
){
Student.save(partialUpdate, id);
return ResponseEntity.ok(repository.save(partialUpdate));
};
}

JPA存储库

@Repository
public interface StudentRepository extends JpaRepository<Student, Integer> {}

学生班

@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue
private int id;
private String name;
private int age;
private String emailAddress;
public Student() {  }
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public Student(int id, String name, int age, String emailAddress) {
this.id = id;
this.name = name;
this.age = age;
this.emailAddress = emailAddress;
}
public static void save(Student partialUpdate, String id) {
partialUpdate.setName(id);
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmailAddress() {
return emailAddress;
}
}

未来的最佳解决方案是向应用程序添加DTO层,并使用它映射到对象。请参阅下面的示例。

public class StudentDto {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

然后您可以通过Mapstruct:将其映射到您的模型

@Mapper
public abstract class StudentMapper {
public static final StudentMapper INSTANCE = 
Mappers.getMapper(StudentMapper.class);

@Mapping
Student studentDtoToStudent(StudentDto studentDto); 
}

Mapstruct依赖项:

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</dependency>

你们将能够向外界隐藏你们的内部结构
在您的控制器中:

public ResponseEntity partialUpdateName(
@RequestBody StudentDto partialUpdate, 
@PathVariable("id") String id)
{
Student student = 
StudentMapper.INSTANCE.studentDtoToStudent(partialUpdate);
}

最后一行会给你一个安全的学生模型,然后你可以保存

  1. 快速解决方案在控制器中:
public ResponseEntity partialUpdateName(
@RequestBody Student partialUpdate, 
@PathVariable("id") String id) 
{
Optional<Student> optionalStudent = repository.findById(id);
if(optionalStudent.isPresent() && partialUpdate!=null) {
Student current=optional.get();
current.setName(partialUpdate.getName());
return ResponseEntity.ok(repository.save(current));     
}  

/* return an error */
}

最新更新