5

我想在每次请求日期时使用 DateTimeFormat.ISO.DATE 来配置 Jackson,例如:

@RequestMapping(value = "income")
  public ResponseEntity calculateIncome(
      @RequestParam(value = "companyName") String companyName,
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
      @RequestParam(value = "startDate") LocalDate startDate,
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
      @RequestParam(value = "endDate") LocalDate endDate
  ) 

我已经尝试在 JacksonConfig 中设置它

mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

或者

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

或者

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);

即使在 application.properties 我试过

spring.jackson.serialization.write_dates_as_timestamps=true

我正在使用带有以下依赖项的spring-boot

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>1.5.10.RELEASE</version>
    </dependency>
<dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>${jackson.version}</version>
    </dependency>

我只是不想一遍又一遍地重复相同的@DataTimeFormat,但没有它,我仍然会收到错误:

在 IntelJ

2018-03-01 15:35:05.539 WARN 8168 --- [nio-8080-exec-1] .wsmsDefaultHandlerExceptionResolver:无法绑定请求元素:org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:无法转换键入“java.lang.String”到所需类型“java.time.LocalDate”;嵌套异常是 org.springframework.core.convert.ConversionFailedException: 无法从类型 [java.lang.String] 转换为类型 [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDate] for value '2018 -02-28'; 嵌套异常是 java.lang.IllegalArgumentException:值的解析尝试失败 [2018-02-28]

邮差

{
    "timestamp": 1519914905555,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
    "message": "Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDate] for value '2018-02-28'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2018-02-28]",
    "path": "/incVat"
}

或者

{
    "timestamp": "2018-03-01T15:36:44.823+0000",
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
    "message": "Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDate] for value '2018-02-28'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2018-02-28]",
    "path": "/incVat"
}
4

2 回答 2

3

解决方案: 我在这里找到了解决方案 这完全是关于自定义编辑器LocalDate和实现Formatter

@Bean
  public Formatter<LocalDate> localDateFormatter() {
    return new Formatter<LocalDate>() {
      @Override
      public LocalDate parse(String text, Locale locale) throws ParseException {
        return LocalDate.parse(text, DateTimeFormatter.ISO_DATE);
      }

      @Override
      public String print(LocalDate object, Locale locale) {
        return DateTimeFormatter.ISO_DATE.format(object);
      }
    };
  }
于 2018-03-12T15:12:20.253 回答
1

你在 pom.xml 中需要这个:

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

在您的配置类中:

@Configuration
public class WebConfigurer {

    @Bean
    @Primary // pay attention on this
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }
}

和 Jackson2Json 配置:

@Configuration
public class Jackson2JsonConfiguration {
    @Bean
    public Jackson2JsonObjectMapper jackson2JsonObjectMapper(ObjectMapper objectMapper) {
        return new Jackson2JsonObjectMapper(objectMapper);
    }
}

如果不起作用,请尝试:

  • 更改jsr310pom.xml 中依赖项的导入顺序。
  • 在属性文件中添加:jackson.serialization.write-dates-as-timestamps = false

我也遇到了奇怪的问题,试图让这项工作也成功。

作为最后一个选项,您可以迁移到Spring Boot 2.0,因为他们翻转了 Jackson 配置默认值,将 JSR-310 日期写入 ISO-8601 字符串。

于 2018-03-01T15:40:52.057 回答