首页 > 解决方案 > 使用 spring-data-rest 处理 @CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt 和 @Version 字段

问题描述

我无法确保用@CreatedBy, @CreatedAt, @ChangedBy ,@ChangedAt and@Version while usingspring-data-rest` 注释的字段中的数据。它以意想不到的方式表现。

  1. PUT在正文没有标记字段@CreatedAt并将@ChangedAt这些字段设置为 时调用端点null。我已经通过用 注释这些字段来解决这个问题updatable = false
  2. POST使用随机(且不正确)@CreatedBy, @CreatedAt,调用端点@ChangedBy@ChangedAt忽略这些值并正确设置这些值的值。
  3. POST使用一些随机值调用端点@Version是在字段中设置不正确的值。我尝试过设置insertable = false,但由于非空约束,这不起作用。

在这一点上,我很困惑如何确保这些字段不会被来自其余端点的错误请求主体破坏。任何帮助表示赞赏。

标签: spring-data-jpaspring-data-rest

解决方案


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

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private String someField;

您可以直接在实体上执行此操作,或者,为了防止您必须将 Jackson 注释引入您的实体,您可以通过 Jackson Mixin 类进行处理。

见:https ://dzone.com/articles/jackson-mixin-to-the-rescue

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

@Configuration
public class RepositoryConfiguration {

    @Autowired
    private Jackson2ObjectMapperBuilder objectMapperBuilder;

    @Bean
    public ObjectMapper objectMapper() {
        objectMapperBuilder.mixIn(SomeClass.class, SomeClassMixin.class);

        return objectMapperBuilder.build();
    }

}

推荐阅读