2012-05-18 19 views
13

tengo debajo Serializador para la manipulación JodaTime:primavera @ResponseBody Jackson JsonSerializer con 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); 
    } 

} 

A continuación, en cada uno los objetos del modelo, hago esto:

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

Con los ajustes anteriores, @ResponseBody y Jackson Mapper funciona. Sin embargo, no me gusta la idea en la que sigo escribiendo @JsonSerialize. Lo que necesito es una solución sin el @JsonSerialize en objetos modelo. ¿Es posible escribir esta configuración en algún lugar en Spring xml como una configuración única?

Agradecemos su ayuda.

Respuesta

10

Aunque puede poner una anotación para cada campo de fecha, es mejor hacer una configuración global para su asignador de objetos. Si utiliza Jackson puede configurar el muelle de la siguiente manera:

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

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

Para 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)")); 
    } 
} 

Por supuesto, SimpleDateFormat puede utilizar cualquier formato que necesita.

+0

'setDateFormat (nuevo SimpleDateFormat (" aaaa-MM-dd'T'HH: mm: ssz "));' me pasó el truco, gracias – Konsumierer

-3

Si simplemente tiene los JAR de Jackson en su classpath y devuelve @ResponseBody, Spring convertirá automáticamente el objeto Model a JSON. No necesita anotar nada en el Modelo para que esto funcione.

+0

Bueno he intentado. Cuando Jackson convirtió el objeto en JSON, convirtió la instancia de JodaTime en una cadena con milisegundos. Es por eso que un convertidor personalizado. Realmente quiero evitar el uso de @JsonSerialize en todas mis variables de fecha. Necesito una forma de configurarlo en el nivel de la aplicación. –

+0

Parece que estaba equivocado en mi suposición. En realidad, hay un error Spring relacionado (https://jira.springsource.org/browse/SPR-6731), pero incluso allí, es para que las anotaciones predeterminadas funcionen. Por lo tanto, parece que necesita anotar en cada clase de modelo. – atrain

+0

Entiendo. No estoy seguro si alguien tiene éxito configurando esto en estilo AOP. Esperemos si alguien más tiene algún comentario. –

1

@Moesio prácticamente lo tengo. Aquí está mi config:

<!-- 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" /> 

El bit que me tiene es que <mvc:annotation-driven/> hace su propia AnnotationMethodHandler e ignora el que usted se hace manualmente. Obtuve la idea de BeanPostProcessing de http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html para configurar la que se usa y ¡voilà! Funciona de maravilla.

0

mismo usando JavaConfig de la primavera 3:

@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; 
    } 
} 
Cuestiones relacionadas