Spring data jpa 使用spring数据rest处理@CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt和@Version字段

Spring data jpa 使用spring数据rest处理@CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt和@Version字段,spring-data-jpa,spring-data-rest,Spring Data Jpa,Spring Data Rest,在使用spring data rest`时,我很难确保字段中的数据被注释为@CreatedBy,@CreatedAt,@ChangedBy,@ChangedAt和@Version。它的行为方式出人意料 当主体没有标记为@CreatedAt和@ChangedAt的字段时,调用PUT端点会将这些字段设置为null。我通过用updateable=false注释这些字段来解决这个问题 使用随机(且不正确的)@CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt调用POST

在使用spring data rest`时,我很难确保字段中的数据被注释为
@CreatedBy
@CreatedAt
,@ChangedBy
@ChangedAt
@Version
。它的行为方式出人意料

  • 当主体没有标记为
    @CreatedAt
    @ChangedAt
    的字段时,调用
    PUT
    端点会将这些字段设置为
    null
    。我通过用
    updateable=false
    注释这些字段来解决这个问题
  • 使用随机(且不正确的)
    @CreatedBy
    @CreatedAt
    @ChangedBy
    @ChangedAt
    调用
    POST
    端点将忽略这些值并正确设置这些值
  • @Version
    调用带有一些随机值的
    POST
    端点会在字段中设置不正确的值。我已尝试设置
    insertable=false
    ,但由于NOTNULL约束,该设置无效

  • 在这一点上,我很困惑如何确保这些字段不会被来自rest端点的错误请求体损坏。非常感谢您的帮助。

    由于客户不应修改这些属性,您应将它们标记为只读

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String someField;
    
    您可以直接在实体上执行此操作,或者为了避免将Jackson注释引入实体,您可以通过Jackson Mixin类进行处理

    见:

    您可以使用以下配置注册Mixin:

    @Configuration
    public class RepositoryConfiguration {
    
        @Autowired
        private Jackson2ObjectMapperBuilder objectMapperBuilder;
    
        @Bean
        public ObjectMapper objectMapper() {
            objectMapperBuilder.mixIn(SomeClass.class, SomeClassMixin.class);
    
            return objectMapperBuilder.build();
        }
    
    }
    

    由于客户端不应修改这些属性,因此应将它们标记为只读

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String someField;
    
    您可以直接在实体上执行此操作,或者为了避免将Jackson注释引入实体,您可以通过Jackson Mixin类进行处理

    见:

    您可以使用以下配置注册Mixin:

    @Configuration
    public class RepositoryConfiguration {
    
        @Autowired
        private Jackson2ObjectMapperBuilder objectMapperBuilder;
    
        @Bean
        public ObjectMapper objectMapper() {
            objectMapperBuilder.mixIn(SomeClass.class, SomeClassMixin.class);
    
            return objectMapperBuilder.build();
        }
    
    }
    

    我相信这将防止仅当请求主体映射到实体对象时才写入值,因为我仍然希望Hibernate处理要修改的审计注释字段。抱歉,我不知道您的评论是什么意思。请求主体还会映射到其他什么地方?很抱歉。我会重申这个问题。上述配置是否会阻止Hibernate更新用
    @CreatedBy
    @CreatedAt
    @ChangedBy
    注释的字段,
    @ChangedAt
    @Version
    ?这些JSON注释显然仅适用于web绑定级别,即当请求正文被反序列化时。我相信这将防止仅当请求正文映射到实体对象时才写入值,因为我仍然希望Hibernate处理审计注释字段待修改。对不起,我不知道你的评论是什么意思。请求主体还会映射到其他什么地方?很抱歉。我会重申这个问题。上述配置是否会阻止Hibernate更新带有
    @CreatedBy
    @CreatedAt
    @ChangedBy
    @ChangedAt
    @Version
    注释的字段?这些JSON注释显然只适用于web绑定级别,即当请求主体被反序列化时。