web-dev-qa-db-fra.com

botte à ressort Joda DateTime Serialization

J'essaie de sérialiser les propriétés Joda DateTime au format ISO-8601 à l'aide de Spring Boot v1.2.0.BUILD-SNAPSHOTVoici ma très simple application REST. 

@RestController
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    class Info{

       private DateTime dateTime;

        public Info(){
            dateTime = new DateTime();
        }
        public DateTime getDateTime() {
           return dateTime;
        }

        public void setDateTime(DateTime dateTime) {
           this.dateTime = dateTime;
        }
    }

    @RequestMapping("/info")
    Info info() {
        return new Info();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
   public Module getModule(){
        return new JodaModule();
   }
}

DateTime est en cours de sérialisation sous forme d'horodatage, par exemple. {"dateTime": 1415954873412} J'ai essayé d'ajouter 

    @Bean
    @Primary
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
                false);
        return objectMapper;
    }

mais cela n'a pas aidé non plus. Alors, comment puis-je configurer jackson dans Spring Boot pour sérialiser en utilisant le format ISO-8601? BTW: J'ai seulement ajouté les dépendances suivantes à ma construction de gradle

compile("joda-time:joda-time:2.4")
compile("org.jadira.usertype:usertype.jodatime:2.0.1")
compile("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.2");
15
edge66

Puisque vous utilisez Spring Boot 1.2, vous devriez pouvoir ajouter simplement ce qui suit dans votre fichier application.properties:

spring.jackson.serialization.write_dates_as_timestamps=false

Cela donnera une sortie sous la forme:

{
    "dateTime": "2014-11-18T19:01:38.352Z"
}

Si vous avez besoin d'un format personnalisé, vous pouvez configurer la JodaModule directement, par exemple pour supprimer la partie temporelle:

@Bean
public JodaModule jacksonJodaModule() {
    JodaModule module = new JodaModule();
    DateTimeFormatterFactory formatterFactory = new DateTimeFormatterFactory();
    formatterFactory.setIso(ISO.DATE);
    module.addSerializer(DateTime.class, new DateTimeSerializer(
        new JacksonJodaFormat(formatterFactory.createDateTimeFormatter()
            .withZoneUTC())));
    return module;
}
20
Phil Webb

Avec Spring Boot 1.2, vous pouvez utiliser une instance fluent builder pour la construction de ObjectMapper:

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return builder
              .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
              .build();
}

Quant à JodaModule, il sera autoconfiguré lorsque com.fasterxml.jackson.datatype:jackson-datatype-joda est sur classpath.

7
tadaskay

Passez une new JodaModule() au constructeur de votre mappeur d'objets.

Annotez vos méthodes Info avec le modèle ISO

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")

ou je pense que vous pouvez l'utiliser si vous utilisez le printemps

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateTimeFormat.ISO.DATE_TIME)
4
tom

Ajoutez ceci à votre application.* dans vos ressources. (J'utilise yamel donc c'est .yml pour moi, mais ce devrait être .properties par défaut)

spring.jackson.date-format: yyyy-MM-dd'T'HH:mm:ssZ

Ou quel que soit le format que vous voulez.

3
Tyler

Il existe également une propriété joda-date-time-format (je pense que cette propriété est apparue pour la première fois dans les versions Spring boot 1.3.x) que vous pouvez définir dans votre application.properties qui fonctionnera pour la sérialisation/désérialisation jackson:

De: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" will be used as a fallback if it is configured with a format string.

Donc, si vous voulez utiliser le format ISO, vous pouvez le définir comme suit:

spring.jackson.joda-date-time-format=yyyy-MM-dd'T'HH:mm:ss.SSSZ

Vous pouvez avoir un nombre différent de «Z» qui modifie l'affichage des identifiants de fuseau horaire ou des heures décalées, à partir de la documentation de joda time ( http://joda-time.sourceforge.net/apidocs/org/joda/time /format/DateTimeFormat.html ):

Zone: 'Z' outputs offset without a colon, 'ZZ' outputs the offset with a colon, 'ZZZ' or more outputs the zone id.
0
raspacorp