在Spring

时间:2016-06-27 08:32:26

标签: json spring spring-mvc

有人可以帮助我吗?

我需要在我的REST应用程序中将Java 8 LocalDate转换为JSON,反之亦然,转换为我调用REST API的MVC应用程序。 SInce默认JacksonJAXbJSONProvider不解析LOcalDate,我写了自定义Mapper如下 并且在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 format

我需要将它传递给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>

由于已有一个默认映射器,我无法将映射器添加到其中。所以我做了以下更改,但它仍然无法正常工作

<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]类型的内部'org.springframework.http.converter.json.MappingJacksonHttpMessageConverter#0' .http.converter.json.MappingJacksonHttpMessageConverter]用key [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]:没有匹配的编辑器或发现转换策略

1 个答案:

答案 0 :(得分:0)

您只需要一个自定义模块,而不是一个映射器。然后相应地配置弹簧:

<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>