【问题标题】:Handling @CreatedBy, @CreatedAt, @ChangedBy, @ChangedAt and @Version fields with spring-data-rest使用 spring-data-rest 处理 @CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt 和 @Version 字段
【发布时间】:2019-02-22 18:24:26
【问题描述】:

我无法确保使用@CreatedBy@CreatedAt、@ChangedBy,@ChangedAtand@Versionwhile usingspring-data-rest` 注释的字段中的数据。它的行为方式出乎意料。

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

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

【问题讨论】:

    标签: spring-data-jpa spring-data-rest


    【解决方案1】:

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

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

    【讨论】:

    • 我相信这将防止在请求正文映射到实体对象时写入值,因为我仍然希望 Hibernate 处理要修改的审核注释字段。
    • 对不起,我不知道你的评论是什么意思。请求正文还会映射到哪里?
    • 对不起。我将重申这个问题。上述配置是否会阻止 Hibernate 更新带有 @CreatedBy@CreatedAt@ChangedBy@ChangedAt@Version 注释的字段?
    • 这些 JSON 注释显然只适用于 Web 绑定级别,即反序列化请求正文时。
    • @AlanHay — 或者对于您正在对实体执行的任何其他 JSON 序列化(这是 mixin 建议的优势之一:您仍然可以在其他 JSON 上下文中反序列化它们)。
    猜你喜欢
    • 2018-02-03
    • 2021-09-06
    • 2014-02-04
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多