gpt4 book ai didi

java - 在ObjectMapper中全局配置JavaTimeModule而不是使用@datetimeformat

转载 作者:太空宇宙 更新时间:2023-11-04 10:21:15 26 4
gpt4 key购买 nike

您好,我尝试创建一个 Controller ,它将接受请求参数作为 LocalDateTime。

ex: /api/actions?page=0&size=10&from=2018-05-02T20:20:20&to=2018-06-02T20:20:20

在 Controller 上,如果我使用下面的代码,它可以工作:

@RequestParam(value = "from")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
LocalDateTime from,
@RequestParam(value = "to")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
LocalDateTime to

但是我想将 @DateTimeFormat 移至全局配置,并且我选择 ObjectMapper:

我在配置中创建一个 bean:

@Bean
public ObjectMapper jacksonObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(
LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}

并尝试

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(
LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}

这是日期时间格式值:yyyy-MM-dd'T'HH:mm:ss.SS

以上两种方式都不起作用,它说:

class org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:无法将类型“java.lang.String”的值转换为所需类型“java.time.LocalDateTime”;嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法将值“2018-05-02T20:20:20”从类型 [java.lang.String] 转换为类型 [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDateTime];嵌套异常是 java.lang.IllegalArgumentException:解析尝试失败的值 [2018-05-02T20:20:20]

我的 jackson 版本:

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

我错过了什么吗?感谢您抽出时间。

最佳答案

class org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException

我认为这里您需要使用JsonSerializerJsonDeserializer

因此,当请求到来时,您使用JsonDeserializer,它会将您的字符串格式的日期转换为所需的日期格式。这是一个代码,

@Component
public class DateDeSerializer extends JsonDeserializer<Date> {

public final SimpleDateFormat formatter = new SimpleDateFormat("date format");

@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
if (jp.getCurrentToken().equals(JsonToken.VALUE_STRING)) {
try {
return formatter.parse(jp.getText());
} catch (ParseException e) {
// throw exception
}
}
return null;
}

@Override
public Class<Date> handledType() {
return Date.class;
}

}

要格式化您的响应,请使用JsonSerializer。这是示例代码,

@Component
public class DateSerializer extends JsonSerializer<Date> {

DateFormat formatter = new SimpleDateFormat("date format");

@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeObject(formatter.format(value));
}

@Override
public Class<Date> handledType() {
return Date.class;
}

}

关于java - 在ObjectMapper中全局配置JavaTimeModule而不是使用@datetimeformat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51146396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com