【问题标题】:Spring Data Rest PATCH forbid update on specific fieldsSpring Data Rest PATCH 禁止更新特定字段
【发布时间】:2017-08-11 12:46:04
【问题描述】:

我目前正在使用 spring-data-rest 开发一个小型 REST Web 服务:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

我遵循了以下指南:https://spring.io/guides/gs/accessing-mongodb-data-rest/,它运行良好。

我在我的 Person.class 上添加了一些注释,以便在 POST 请求期间验证对象(如 @NonNull 等),如下所示:

public class Person {

    @Id
    private String id;

    @NonNull
    private String firstName;

    @NonNull
    private String lastName;

    private Integer age;

}

但现在我想做一个 PATCH 请求来更新我的对象(通过请求 curl -X PATCH http://localhost:8080/people/598c2a80d8425fae64161cc4 -d '{"age":23}')。

它也可以正常工作,但我想阻止某些字段的更新,例如,不应允许人们更新 firstName 和 lastName。

有什么方法可以通过注释轻松完成吗?还是我必须对每个 PATCH(或 PUT)请求进行自定义验证?我不喜欢这种解决方案,因为我必须对模型的每个实体都这样做。

我希望我清楚地暴露了我的问题,如果不清楚,请随时问我更多问题。

感谢您的帮助。

【问题讨论】:

标签: java spring mongodb rest


【解决方案1】:

你可以使用:

@Column(updatable = false)
@NonNull
private String firstName;

这不会引发错误,但会避免更新该字段。

【讨论】:

    【解决方案2】:

    您可以覆盖特定的 PATCH 端点并仅保留允许的字段

    @PatchMapping("/persons/{id}")
    HttpEntity<?> patchPerson(@PathVariable("id") Person person,
                            @RequestBody final ObjectNode patch,
                            PersistentEntityResourceAssembler assembler) {
        List<String> allowedFields = List.of("age");
        ObjectNode validPatch = patch.retain(allowedFields);
        Person patchedPerson = jsonPatcher.merge(validPatch, person);
    
        Person entity = personRepository.save(patchedPerson);
        PersistentEntityResource resource = assembler.toFullResource(entity);
        return ResponseEntity.accepted().body(resource);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2018-01-08
      • 2017-08-13
      • 1970-01-01
      • 2018-05-04
      相关资源
      最近更新 更多