在春季将LocalDate Mapper添加到消息转换器 [英] Adding LocalDate Mapper to message-converters in spring
问题描述
有人可以在这里帮助我吗?
Can someone help me here please ?
我需要将我的REST应用程序中的Java 8 LocalDate转换为JSON,反之亦然,将其转换为我在其中调用REST API的MVC应用程序.因为默认的JacksonJAXbJSONProvider不能解析LOcalDate,所以我写了如下的自定义Mapper 并在pom.xml
I need to convert Java 8 LocalDate to JSON and vice versa in my REST application to MVC application where I am calling REST API's. SInce default JacksonJAXbJSONProvider does not parse LOcalDate, I wrote custom Mapper as below And dependency is added in pom.xml
public class LocalDateObjectMapperContextResolver implements ContextResolver<ObjectMapper>{
private final ObjectMapper MAPPER;
public LocalDateObjectMapperContextResolver() {
MAPPER = new ObjectMapper();
MAPPER.registerModule(new JavaTimeModule());
//MAPPER.findAndRegisterModules();
MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
这是在 Java 8 LocalDate Jackson格式
我需要将其传递给spring.xml中的消息转换器.
I need to pass it to message-converters in spring.xml.
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
p:objectMapper-ref="objectMapper"/>
</mvc:message-converters>
</mvc:annotation-driven>
由于已经有一个默认的映射器,因此无法将其添加到其中.因此,我进行了以下更改,但仍然无效
Since one default mapper is already there, I cannot add my mapper to it. So I made below changes, but it still does not work
<mvc:annotation-driven >
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
<!-- p:objectMapper-ref="objectMapper"/> -->
<property name="objectMapper" ref="localDateMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这显然是不正确的,因为我在需要映射器的地方传递了解析器.如何调用自定义类的getContext()方法并在Message Converter中进行设置? 现在它开始启动应用程序时引发异常 创建名称为'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0'的bean时出错:无法创建类型为[org.springframework的内部bean'org.springframework.http.converter.json.MappingJacksonHttpMessageConverter#0' .http.converter.json.MappingJacksonHttpMessageConverter],同时使用键[0]设置bean属性"messageConverters";嵌套的异常是org.springframework.beans.factory.BeanCreationException:在ServletContext资源[/WEB-INF/spring.xml]中定义的名称为'org.springframework.http.converter.json.MappingJacksonHttpMessageConverter#0'的bean创建时出错.豆失败了;嵌套的异常是org.springframework.beans.ConversionNotSupportedException:无法将类型'**** package ***.LocalDateObjectMapperContextResolver'的属性值转换为属性'objectMapper'所需的类型'org.codehaus.jackson.map.ObjectMapper';嵌套异常是java.lang.IllegalStateException:无法将[**** package ***.LocalDateObjectMapperContextResolver]类型的值转换为属性'objectMapper'的必需类型[org.codehaus.jackson.map.ObjectMapper]:没有匹配的编辑器或找到转换策略
This is obviously not correct since I am passing resolver where mapper is required. How do I call getContext() method of custom class and set that in Message Converter ? Now it started throwing exception whilel starting application Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0': Cannot create inner bean 'org.springframework.http.converter.json.MappingJacksonHttpMessageConverter#0' of type [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter] while setting bean property 'messageConverters' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.http.converter.json.MappingJacksonHttpMessageConverter#0' defined in ServletContext resource [/WEB-INF/spring.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '****package***.LocalDateObjectMapperContextResolver' to required type 'org.codehaus.jackson.map.ObjectMapper' for property 'objectMapper'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [****package***.LocalDateObjectMapperContextResolver] to required type [org.codehaus.jackson.map.ObjectMapper] for property 'objectMapper': no matching editors or conversion strategy found
推荐答案
您只需要一个自定义模块,而不需要一个映射器.然后相应地配置spring:
You need only a custom module, not a mapper. Then configure spring accordingly:
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
p:simpleDateFormat="yyyy-MM-dd"
p:modulesToInstall="your.module.JavaTimeModule"/>
<bean id="xmlMapper" parent="objectMapper" p:createXmlMapper="true"/>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper"/>
</bean>
<bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
<property name="objectMapper" ref="xmlMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这篇关于在春季将LocalDate Mapper添加到消息转换器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!