Spring data jpa 使用spring数据rest处理@CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt和@Version字段
在使用spring data rest`时,我很难确保字段中的数据被注释为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
@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绑定级别,即当请求主体被反序列化时。