15

我有以下用于 JodaTime 处理的序列化程序:

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

使用上述设置,@ResponseBodyJackson Mapper 肯定可以工作。但是,我不喜欢我一直在写的想法@JsonSerialize。我需要的是一个没有@JsonSerialize模型对象的解决方案。是否可以在 spring xml 中的某处编写此配置作为一个配置?

感谢你的帮助。

4

5 回答 5

11

尽管您可以为每个日期字段添加注释,但最好为您的对象映射器进行全局配置。如果您使用杰克逊,您可以按如下方式配置您的弹簧:

<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 可以使用您需要的任何格式。

于 2012-05-31T13:59:00.090 回答
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并忽略了你手动制作的那个。我从http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html获得了 BeanPostProcessing 的想法来配置使用的那个,瞧!奇迹般有效。

于 2013-02-16T01:48:26.077 回答
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;
    }
}
于 2014-01-30T13:46:17.727 回答
0

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

spring:
    jackson:
       date-format: yyyy-MM-dd
       time-zone: Asia/Shanghai
       joda-date-time-format: yyyy-MM-dd
于 2018-03-23T05:34:10.527 回答
-3

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

于 2012-05-20T15:30:06.350 回答