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

标签 java spring spring-boot jpa patch

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

我的 Controller

@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;
    }
}

最佳答案

future 最好的解决方案是在您的应用程序中添加一个 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); 
}

映射结构依赖:

<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>

您将能够对外界隐藏您的内部结构。
在你的 Controller 中:

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

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

  1. 快速解决方案 在你的 Controller 中:
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 */
}

关于java - 如何使用 @patch 使用 jpa 存储库更新单个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62986824/

相关文章:

java - 未找到带有 URI 调度程序错误的 HTTP 请求的映射

java - 无法将类型 'java.lang.String' 的值转换为所需类型 'long' ;嵌套异常是 java.lang.NumberFormatException : For input string: ""

spring-boot - Prometheus 不会从执行器/prometheus 中抓取指标

java - 静态导入和构造函数

java - 绑定(bind)到 Guice 提供程序实例时显式添加绑定(bind)器依赖项

java - Kotlin:根据@JsonView更改json属性名称

java - 如何使用 Proguard 保留扩展并实现接口(interface)的类

java - 使用@ConditionaOnProperty注释的类的Spring和Web集成测试

java - Hibernate sessionFactory.getCurrentSession() 与 Spring 一起使用时

java - JEE架构问题: Service can inject Service? 或者Service只能注入(inject)Dao?