Java 有没有';预测';在春季,参数的数据休息?

Java 有没有';预测';在春季,参数的数据休息?,java,spring-boot,spring-data-rest,Java,Spring Boot,Spring Data Rest,SDR中的投影对于控制json输出非常有用。但是对于REST调用中的输入和参数呢 当我实现自己的控制器时,我能够通过以下两种方式实现输入(创建/更新)的自定义“投影” 创建与完整实体不同的自定义DTO 或者我可以使用@JsonView并在输入的过程中省略某些字段 这两种方法都不适用于SDR,因为您不编写控制器。怎么做?反映评论部分讨论的问题: 将@Postload方法添加到实体: @PostLoad public void postLoad() { ... store the value

SDR中的投影对于控制json输出非常有用。但是对于REST调用中的输入和参数呢

当我实现自己的控制器时,我能够通过以下两种方式实现输入(创建/更新)的自定义“投影”

  • 创建与完整实体不同的自定义DTO
  • 或者我可以使用@JsonView并在输入的过程中省略某些字段

  • 这两种方法都不适用于SDR,因为您不编写控制器。怎么做?

    反映评论部分讨论的问题:

    @Postload
    方法添加到实体:

    @PostLoad
    public void postLoad() {
        ... store the values of the un-updateable fields into transient fields with @JsonIgnore
    }
    
    @JsonIgnore
    @Transient
    private String originalValue1;
    
    @JsonIgnore
    @Transient
    private String originalValue2;
    
    创建
    @HandleBeforeSave
    事件处理程序。它在更新期间调用,但在创建期间不调用

    将存储的值复制到此处理程序中的原始字段

    • 在创建过程中,不会调用事件处理程序,可以通过标准SDR端点设置所有字段
    • 在更新过程中,在保存之前用更改的值替换其原始值,因此保存实体时将保留原始值
    我有一种不好的感觉,这是一个XY问题。原版是什么?你为什么需要这个功能?什么意思?假设我只想允许客户端更新实体的5个字段中的3个。如何在SDR中指出这一点?将
    @JsonProperty(access=access.READ_ONLY)
    添加到其他两个字段,并拒绝PUT请求。因此,当客户端发送补丁请求时,这两个字段将是ignoredIt,而不是只读字段。您可以在创建时写入,但不能在更新时写入。在这种情况下,解决方案可能会更混乱,但仍然比创建“投影”更容易。我会补充一个答案,我想这是可行的,但这是一个非常丑陋的黑客。首先,在写入之前读取值会造成不必要的性能损失。为什么SDR不能允许您指定您接受的内容?我有一个坏消息告诉您:SDR总是先读取值,然后再写入:)好吧,这很公平,但需要认真考虑。真的没有办法吗?我想您可以覆盖自定义控制器(如update)中的特定REST调用,并使其接受DTO?