java - 无法通过 Jackson2ObjectMapperBuilder DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 将空字符串设置为 null

标签 java spring rest spring-boot jackson

问题

我试图让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/

相关文章:

java - Spring & hibernate 配置(使用 Maven): java. lang.ClassNotFoundException : org. hibernate.cfg.Configuration

Java过滤器-根据请求有条件地更改响应主体

java - 将 Spring 项目上传到有/没有服务器的 github 帐户以及如何嵌入 mysql 数据库

java - 使用新主键克隆现有对象

java - 验证来自已签名 jar 的 http 请求

java - 在按钮而不是 href 链接中传递值

api - 如何撤消 DELETE 操作并遵守 RESTful 标准?

java - C++ Thrift : Can I use TFramedTransportFactory with TThreadedServer?

java - 如何通过 JSON API 实现复杂的条件批量部分更新?

java - Tomcat 7.0 + Chrome 不显示 JSON