春天@ResponseBody杰克逊JsonSerializer与JodaTime

时间:2012-05-18 08:38:50

标签: json spring spring-mvc jackson jodatime

我有以下用于JodaTime处理的Serializer:

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {

    private static final String dateFormat = ("MM/dd/yyyy");

    @Override
    public void serialize(DateTime date, JsonGenerator gen, SerializerProvider provider)
            throws IOException, JsonProcessingException {

        String formattedDate = DateTimeFormat.forPattern(dateFormat).print(date);

        gen.writeString(formattedDate);
    }

}

然后,在每个模型对象上,我这样做:

@JsonSerialize(using=JodaDateTimeJsonSerializer.class )
public DateTime getEffectiveDate() {
    return effectiveDate;
}

通过以上设置,@ResponseBody和Jackson Mapper确实有效。但是,我不喜欢我一直在写@JsonSerialize的想法。我需要的是一个没有@JsonSerialize模型对象的解决方案。是否可以将此配置在spring xml中的某个位置编写为一个配置?

感谢您的帮助。

5 个答案:

答案 0 :(得分:11)

虽然您可以为每个日期字段添加注释,但最好为对象映射器执行全局配置。如果您使用jackson,您可以按如下方式配置弹簧:

<bean id="jacksonObjectMapper" class="com.company.CustomObjectMapper" />

<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" >
</bean>

对于CustomObjectMapper:

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        super();
        configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
        setDateFormat(new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ (z)"));
    }
}

当然,SimpleDateFormat可以使用您需要的任何格式。

答案 1 :(得分:1)

@Moesio得到了它。这是我的配置:

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven/>

<!-- Instantiation of the Default serializer in order to configure it -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterConfigurer" init-method="init">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper" ref="jacksonObjectMapper" />
            </bean>
        </list>
    </property>
</bean>

<bean id="jacksonObjectMapper" class="My Custom ObjectMapper"/>

<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" />

让我感到震惊的是<mvc:annotation-driven/>创建了自己的AnnotationMethodHandler并忽略了您手动创建的{{1}}。我从http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html获得了BeanPostProcessing的想法来配置一个被使用的想法,并且瞧!像魅力一样。

答案 2 :(得分:0)

使用Spring 3的JavaConfig:

@Configuration
@ComponentScan()
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter
{

    @Override
    public void configureMessageConverters(final List<HttpMessageConverter<?>> converters)
    {
        converters.add(0, jsonConverter());
    }

    @Bean
    public MappingJacksonHttpMessageConverter jsonConverter()
    {
        final MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
        converter.setObjectMapper(new CustomObjectMapper());

        return converter;
    }
}

答案 3 :(得分:0)

如果您使用的是Spring Boot,请在application.yml中尝试:

spring:
    jackson:
       date-format: yyyy-MM-dd
       time-zone: Asia/Shanghai
       joda-date-time-format: yyyy-MM-dd

答案 4 :(得分:-3)

如果您只是在类路径上安装了Jackson JAR,并返回@ResponseBody,Spring会自动将Model对象转换为JSON。您无需在模型中注释任何内容即可使其正常工作。