我有以下用于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中的某个位置编写为一个配置?
感谢您的帮助。
答案 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。您无需在模型中注释任何内容即可使其正常工作。