【问题标题】:Jackson serialization/deserialization for ZonedDateTimeZonedDateTime 的 Jackson 序列化/反序列化
【发布时间】:2017-11-26 13:20:48
【问题描述】:

这是我的 html 表单的一部分。

<form th:object="${applyForm}" class="form-horizontal" role="form" method="post" >
    <div class="form-group">
                            <label class="col-sm-3 control-label no-padding-right"
                                for="form-field-1"> Start Date </label>

                            <div class="col-sm-9">
                                <input type="date" id="form-field-1" th:field="*{startDate}"
                                    placeholder="Completion Date- Estimated"
                                    class="col-xs-10 col-sm-7" />
                            </div>
                        </div>

                        <div class="form-group">
                            <label class="col-sm-3 control-label no-padding-right"
                                for="form-field-1"> Completion Date </label>

                            <div class="col-sm-9">
                                <input type="date" id="form-field-1" th:field="*{completionDate}"
                                    placeholder="Completion Date- Estimated"
                                    class="col-xs-10 col-sm-7" />
                            </div>
                        </div>
</form>

我正在使用 Lombak。

public class ApplicationForm implements Serializable {

    private static final long serialVersionUID = -2961891549847290936L;

    @Column(name = "start_date", nullable = false)
    private ZonedDateTime startDate;

    //@DateTimeFormat(pattern = "yyyy-mm-dd")
    @Column(name = "completion_date", nullable = false)
   private ZonedDateTime completionDate;

}

这是我尝试提交表单时的错误。我试过使用@DateTimeFormat,但我仍然无法摆脱这个错误。我正在使用 spring 和 hibernate。

Field error in object 'applyForm' on field 'commencementDate': rejected value [2017-11-23]; codes [typeMismatch.applyForm.commencementDate,typeMismatch.commencementDate,typeMismatch.java.time.ZonedDateTime,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [applyForm.commencementDate,commencementDate]; arguments []; default message [commencementDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.ZonedDateTime' for property 'commencementDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.persistence.Column java.time.ZonedDateTime] for value '2017-11-23'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2017-11-23]]
Field error in object 'applyForm' on field 'completionDate': rejected value [2017-07-30]; codes [typeMismatch.applyForm.completionDate,typeMismatch.completionDate,typeMismatch.java.time.ZonedDateTime,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [applyForm.completionDate,completionDate]; arguments []; default message [completionDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.ZonedDateTime' for property 'completionDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.persistence.Column java.time.ZonedDateTime] for value '2017-07-30'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2017-07-30]]

【问题讨论】:

  • 只需使用适当的类型:您要向用户询问日期(年 + 月 + 日)。不是带有时区的纳秒级精确瞬间。所以使用 LocalDate,而不是 ZonedDateTime。
  • 尽管我更改为 LocalDate,但仍然出现同样的错误。当我将其更改为日期时,错误消失了。非常感谢!

标签: spring hibernate spring-mvc jackson


【解决方案1】:

您需要添加用于序列化/反序列化 Java 8 日期/时间类型的 jackson 模块,以便您可以将 jackson 消息转换器配置为自动处理 Java 8 数据类型的序列化和反序列化。

Maven 依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

然后在您的 spring 配置中,配置 MappingJackson2HttpMessageConverter 以使用注册新模块的 ObjectMapper。

@Configuration
@EnableWebMvc
public class Config extends WebMvcConfigurerAdapter {

    // ... Other configs

    @Bean
    public MappingJackson2HttpMessageConverter converter() {
        ObjectMapper mapper = new ObjectMapper()
                .registerModule(new JavaTimeModule());

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(mapper);

        return converter;
    }

    @Override
    public void configureMessageConverters( List<HttpMessageConverter<?>> converters ) {
        converters.add(converter());
    }
}

Here 是 Jackson Java 8 数据类型模块的 README.md

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2019-01-26
    • 2021-04-13
    • 1970-01-01
    • 2013-01-01
    • 2016-12-11
    • 1970-01-01
    • 2023-03-04
    • 2019-06-18
    相关资源
    最近更新 更多