在 ObjectMapper 中全局配置 JavaTimeModule 而不是使用 @datetimeformat
Configure JavaTimeModule in ObjectMapper globally instead of using @datetimeformat
您好,我尝试创建一个控制器,它将接受请求参数作为 LocalDateTime。
ex: /api/actions?page=0&size=10&from=2018-05-02T20:20:20&to=2018-06-02T20:20:20
在控制器上,如果我使用下面的代码它工作:
@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;
}
这是 dateTimeFormat 值: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:无法从类型 [java.lang.String] 转换为值 '2018-05-02T20:20:20' 的类型 [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDateTime];嵌套异常是 java.lang.IllegalArgumentException:解析值 [2018-05-02T20:20:20]
失败
我的杰克逊版本:
<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
我认为这里你需要使用 JsonSerializer 和 JsonDeserializer.
因此,当请求到来时,您可以使用 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;
}
}
问题是我在 requestParam 中传递了 LocalDateTime,但我使用的 ObjectMapper 只适用于请求的主体。
为了解决我的问题,我创建了新组件 LocalDateTimeConverter 并删除了 ObjectMapper 的 bean。
@Component
public class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
private final DateTimeFormatter formatter;
@Autowired
public LocalDateTimeConverter(@Value("${dateTime.format}") String dateTimeFormat) {
this.formatter = DateTimeFormatter.ofPattern(dateTimeFormat);
}
@Override
public LocalDateTime convert(String source) {
if (source == null || source.isEmpty()) {
return null;
}
return LocalDateTime.parse(source, formatter);
}
}
您好,我尝试创建一个控制器,它将接受请求参数作为 LocalDateTime。
ex: /api/actions?page=0&size=10&from=2018-05-02T20:20:20&to=2018-06-02T20:20:20
在控制器上,如果我使用下面的代码它工作:
@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;
}
这是 dateTimeFormat 值: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:无法从类型 [java.lang.String] 转换为值 '2018-05-02T20:20:20' 的类型 [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDateTime];嵌套异常是 java.lang.IllegalArgumentException:解析值 [2018-05-02T20:20:20]
失败我的杰克逊版本:
<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
我认为这里你需要使用 JsonSerializer 和 JsonDeserializer.
因此,当请求到来时,您可以使用 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;
}
}
问题是我在 requestParam 中传递了 LocalDateTime,但我使用的 ObjectMapper 只适用于请求的主体。
为了解决我的问题,我创建了新组件 LocalDateTimeConverter 并删除了 ObjectMapper 的 bean。
@Component
public class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
private final DateTimeFormatter formatter;
@Autowired
public LocalDateTimeConverter(@Value("${dateTime.format}") String dateTimeFormat) {
this.formatter = DateTimeFormatter.ofPattern(dateTimeFormat);
}
@Override
public LocalDateTime convert(String source) {
if (source == null || source.isEmpty()) {
return null;
}
return LocalDateTime.parse(source, formatter);
}
}