问题
我试图让Jackson
将任何空字符串
设置为null
,这是在Spring-boot
中应用。我们已向 POJO 添加了验证,以检查该值是否在 1 到 255 IFF 之间(IFF 正在设置该值)。
@Size(min = 1, max = 255)
@Column(length = 255)
private String businessTitle;
问题是,当将空字符串
传递给验证时,它将失败并出现javax.validation.ConstraintViolationException
异常,因为它正在检查空字符串。
我尝试在 Jackson2ObjectMapperBuilder
上设置 DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
,以便它将这些空字符串设置为 null,并且验证不会失败。但这并没有发生,它继续将空字符串
传递到对象的save()
中。
问题
在保存 Ojbject 时,出了什么问题或者需要进行调整才能将空字符串
正确设置为null
?
代码
对象
@Size(min = 1, max = 255)
@Column(length = 255)
private String businessTitle;
jackson 配置
@Configuration
public class JacksonConfiguration {
@Bean
public Jackson2ObjectMapperBuilder filteringObjectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
builder.featuresToEnable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
return builder;
}
}
异常
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [com..model.User] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='size must be between 1 and 255', propertyPath=businessTitle, rootBeanClass=class com..model.User, messageTemplate='{javax.validation.constraints.Size.message}'}
]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:138)
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(BeanValidationEventListener.java:86)
at org.hibernate.action.internal.EntityUpdateAction.preUpdate(EntityUpdateAction.java:244)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:118)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:61)
... 127 common frames omitted
最佳答案
DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
不会帮助你,因为它意味着“将对象字段的空字符串 JSON 值反序列化为 null”,不幸的是你的字符串字段是标量而不是 JSON 对象。
我认为没有方便的方法来获得你想要的行为。可以覆盖 String 类型的所有字段的反序列化行为,但您可能不想要它。您也可以定义自定义反序列化器,但您需要像这样注释每个字段:
@JsonDeserialize(using = MyStringDeseralizer.class)
private String businessTitle;
哪里class MyStringDeseralizer extends JsonDeserializer<String>
并实现您需要的转换逻辑。
关于java - 无法通过 Jackson2ObjectMapperBuilder DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 将空字符串设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272398/