2017-03-09 1 views
1

Ce que je voudrais

dans une botte Spring 1.5.2 projet, je vous envoie des files d'attente/sujets messages JSON à certains JMS (ActiveMQ) via JmsTemplate#convertAndSend. J'utilise Java 8 avec quelques instances de LocalDate et LocalDateTime. Je voudrais changer la sortie JSON légèrement:sortie Configurer JSON dans les messages JMS Spring

  • joliment imprimer le JSON; et
  • rendre les dates/horodatages au format ISO.

Par défaut, le JSON finit en une seule ligne, et les dates/horodatages sont convertis en un format par champs, par exemple:

"startDate" : { "year" : 2017, "month" : "MARCH", "era" : "CE", "dayOfYear" : 64, "dayOfWeek" : "SUNDAY", "leapYear" : false, "dayOfMonth" : 5, "monthValue" : 3, "chronology" : { "calendarType" : "iso8601", "id" : "ISO" } } 

Ce que j'ai essayé

Je avons ajouté jackson-datatype-jsr310 aux dépendances du projet et je l'ai également mis

spring.jackson.serialization.indent-output=true 
spring.jackson.serialization.write_dates_as_timestamps=false 

dans application.properties. Pas de changement de comportement.

J'ai ensuite essayé modifier l'initialisation du convertisseur de message à inclure ces paramètres:

@Bean 
@Primary 
public MessageConverter jacksonJmsMessageConverter() { 
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); 
    converter.setTargetType(MessageType.TEXT); 
    converter.setTypeIdPropertyName("_type"); 

    ObjectMapper objectMapper = new ObjectMapper(); 
    // default settings for MappingJackson2MessageConverter 
    objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); 
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    // add settings I want 
    objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
    converter.setObjectMapper(objectMapper); 

    return converter; 
} 

Mais il n'y a toujours pas de changement de comportement.

Comment personnaliser la sortie JSON comme décrit ci-dessus?

Répondre

2

En outre configurer le mappeur objet comme ceci:

JavaTimeModule timeModule = new JavaTimeModule(); 
    timeModule.addSerializer(LocalDate.class, 
     new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE)); 
    timeModule.addSerializer(LocalDateTime.class, 
     new LocalDateTimeSerializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); 
    objectMapper.registerModule(timeModule); 

en ligne avec cette réponse ici: https://stackoverflow.com/a/41089874/72625