2016-12-11 1 views
2

Ich ersetze JodaTime durch JSR310 und das Modul von JodaTime() war in Ordnung.Serialize Date, Instant zu ISO 8601 bei der Verwendung von JSR310 java.time im Frühjahr

Ich versuche, die Serialisierung meiner Daten in meiner Spring-Boot-Anwendung neu zu konfigurieren.

ich nicht beide so eine Art und Weise halten kann ich suche mein Date ISO zu serialisiert/deserialisiert 8601.

ich die Ratschläge hier gefolgt, aber das nicht hilft: Dieser http://lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/

meine ist JacksonConfig.java mit dem objectMapper:

@Configuration 
public class JacksonConfig extends RepositoryRestMvcConfiguration { 

    private static final Logger logger = LoggerFactory.getLogger(JacksonConfig.class); 
    public static final DateTimeFormatter FORMATTER = ofPattern("dd::MM::yyyy"); 

    @Bean 
    // Override and Primary due to bug: https://github.com/spring-projects/spring-boot/issues/6529 
    @Override 
    @Primary 
    public ObjectMapper objectMapper() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true); 
     mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
     JavaTimeModule javaTimeModule = new JavaTimeModule(); 
     javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer()); 
     javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer()); 
     mapper.registerModule(javaTimeModule); 
     return mapper; 
    } 

    public class LocalDateSerializer extends JsonSerializer<LocalDate> { 
     @Override 
     public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 
      gen.writeString(value.format(FORMATTER)); 
     } 
    } 
    public class LocalDateDeserializer extends JsonDeserializer<LocalDate> { 
     @Override 
     public LocalDate deserialize(JsonParser p, DeserializationContext ctx) throws IOException { 
      return LocalDate.parse(p.getValueAsString(), FORMATTER); 
     } 
    } 
} 

die Bohne instanziiert erhalten, aber die serialize und deserialize nie aufgerufen.

Ich habe auch die JavaTimeModule ohne den benutzerdefinierten Serializer/Deserializer versucht, es funktioniert auch nicht.

Es scheint überhaupt keine Wirkung zu haben.

Gibt es eine Möglichkeit, dies ein bisschen mehr zu debuggen?

Ich bin mit feder hateoas und Feder-Daten, ich habe dieses Problem, das in Zusammenhang stehen könnte:

https://github.com/spring-projects/spring-hateoas/issues/333

Antwort

1

Nutzen Sie den ser/deser in dem Java-Zeitmodul zur Verfügung gestellt. Dies legt sie tatsächlich mit dem benutzerdefinierten Formatierer fest.

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; 
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; 

public ObjectMapper objectMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true); 
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
    JavaTimeModule javaTimeModule = new JavaTimeModule(); 
    LocalDateSerializer localDateSerializer = new LocalDateSerializer(FORMATTER); 
    javaTimeModule.addSerializer(LocalDate.class, localDateSerializer); 
    LocalDateDeserializer localDateDeserializer = new LocalDateDeserializer(FORMATTER); 
    javaTimeModule.addDeserializer(LocalDate.class, localDateDeserializer); 
    mapper.registerModule(javaTimeModule); 
    return mapper; 
} 
+0

Wissen Sie, warum dies keinen Effekt hat und wie könnte. Ich debugge dies? Wie gesagt, der Deserialiser Serialize wird nie gefeuert – BigDong

+0

Wie kann ich sie direkt zum Objekt Mapper hinzufügen? Es tut mir nicht leid – BigDong

+0

Sie können das versuchen, ohne Java-Zeitmodul zu registrieren. Fügen Sie ser/deser mit einem einfachen Modul hinzu und registrieren Sie das Modul im Objekt mapper.SimpleModule module = new SimpleModule(); module.addSerializer (LocalDate.class, neuer LocalDateSerializer()); mapper.registerModule (Modul); etwas wie das. – Veeram