2016-10-06 3 views
2

registriert Ich versuche, JSON mit Jackson im Frühjahr zu deserialisieren. Ich habe es konfiguriert, um einen benutzerdefinierten MappingJackson2HttpMessageConverter zu verwenden, und ich kann sehen, dass es registriert wird. Immer noch, wenn ich versuche, zu deserialisieren, sehe ich, dass es nicht meine benutzerdefinierte MappingJackson2HttpMessageConverter verwendet, sondern stattdessen die defaultList von HttpMessageConverters (mit anderen Worten, es ist nicht überschrieben). Irgendeine Idee, wie es gelöst werden könnte? Vielen Dank.Custom Jackson Deserializer wird nicht im Frühjahr

package com.bigid.scanner.service.restapi; 

import com.bigid.scanner.api.datalink.DataLink; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.converter.HttpMessageConverter; 
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

import java.text.SimpleDateFormat; 
import java.util.List; 

@Configuration 
@EnableWebMvc 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     super.configureMessageConverters(converters); 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     builder.mixIn(DataLink.class, PolymorphicDataLinkMixin.class); 
     converters.add(new MappingJackson2HttpMessageConverter(builder.build())); 
    } 
} 

Antwort

0

Vielen Dank für Ihre Hilfe.

Problem war ich hatte <mvc: annotation-driven> in der web.xml-Datei. mit dem Standard messageConverters (insgesamt 9)

  • einmal durch meinen Code

    • Sobald die nur ein Register würde: Aus diesem Grunde würden die messageConverters zwei Mal registrieren lassen.

    Während Werte mit @RequestBody Verarbeitung, würden sie durch die Rückstellung eine serialisiert erhalten (9 messageConverters) und nicht von mir (nicht sicher, ob dies zufälliges Verhalten ist, aber jeder Fall wäre es zu unerwarteten Ergebnissen führen).

    Hoffe es hilft jemandem!

  • 0

    ich glaube, Sie super.configureMessageConverters(converters); am Ende der überschrieben configureMessageConverters oder Sie es nicht überhaupt anrufen und bietet den anderen Standard Konvertern nennen sollten.

    Versuchen 1

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
        builder.mixIn(DataLink.class, PolymorphicDataLinkMixin.class); 
        converters.add(new MappingJackson2HttpMessageConverter(builder.build())); 
    
        super.configureMessageConverters(converters); 
    } 
    

    Versuchen 2 (nicht super.configureMessageConverters Aufruf)

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
        builder.mixIn(DataLink.class, PolymorphicDataLinkMixin.class); 
        converters.add(new MappingJackson2HttpMessageConverter(builder.build())); 
    
        super.addDefaultHttpMessageConverters(); 
    } 
    
    0
    @Configuration 
    @EnableWebMvc 
    public class WebConfiguration extends WebMvcConfigurerAdapter { 
    
         protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
          converters.add(converter()); 
          addDefaultHttpMessageConverters(converters); 
         } 
    
         @Bean 
         MappingJacksonHttpMessageConverter converter() { 
          MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter() 
          //do your customizations here... 
          return converter; 
         } 
        } 
    
    0

    Viele dieser Antworten sehen gut aus. Wenn Sie Spring Boot verwenden, müssen Sie außerdem sicherstellen, dass die @ EnableWebMvc-Annotation nicht in Ihrer Konfiguration enthalten ist. Ich habe viele Stunden damit verbracht, verschiedene Methoden auszuprobieren (einige davon sind in den Fragen und Antworten hier dokumentiert), um benutzerdefinierte Jackson-Serializer und Deserializer zu registrieren/konfigurieren, von denen keine korrekt funktionierte. Während des Debugging konnte ich sehen, dass der Registrierungscode beim Start der Anwendung aufgerufen wurde, aber die De/Serializer wurden nie aufgerufen. Anscheinend hat @EnableWebMvc diese Registrierungen in der Spring Boot-Umgebung überschrieben. Durch einfaches Entfernen dieser Anmerkung funktionierte alles wie erwartet.

    Verwandte Themen