2013-01-16 2 views
14

Ich entwickle einen REST-Webservice im Frühjahr MVC. Ich muss ändern, wie Jackson 2 mongodb objectids serialisiert. Ich bin mir nicht sicher, was zu tun, weil ich Teil-Dokumentation für jackson 2 gefunden, was ich tat, ist ein benutzerdefinierten Serializer zu erstellen:Spring 3.2 und Jackson 2: benutzerdefinierte Objekt Mapper hinzufügen

public class ObjectIdSerializer extends JsonSerializer<ObjectId> { 


    @Override 
    public void serialize(ObjectId value, JsonGenerator jsonGen, 
      SerializerProvider provider) throws IOException, 
      JsonProcessingException { 
     jsonGen.writeString(value.toString()); 
    } 
} 

erstellen ObjectMapper

public class CustomObjectMapper extends ObjectMapper { 

    public CustomObjectMapper() { 
     SimpleModule module = new SimpleModule("ObjectIdmodule"); 
     module.addSerializer(ObjectId.class, new ObjectIdSerializer()); 
     this.registerModule(module); 
    } 

} 

und dann die Mapper registrieren

<mvc:annotation-driven> 
    <mvc:message-converters register-defaults="true"> 
     <bean 
      class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="my.package.CustomObjectMapper"></bean> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

Mein CustomConverter wird nie aufgerufen. Ich denke, die CustomObjectMapper-Definition ist falsch, ich habe es aus einem Code für Jackson 1.x

In meinen Controllern verwende ich @ResponseBody. Wo mache ich mich falsch? Dank

+2

Serializer und Registrierung sehen für mich richtig aus, ich denke, das Problem liegt in der XML-Konfiguration. – StaxMan

+1

Ja, danke für den Vorschlag, ich hatte ein leeres -Tag um die Datei. Es funktioniert jetzt – alex

+0

FYI sagen die Docs, stattdessen StdSerializer zu verwenden: http://fasterxml.github.io/jackson-databind/javadoc/2.0/com/fasterxml/jackson/databind/ser/std/StdSerializer.html – testing123

Antwort

0

Wie würde ich dies tun, ist:

eine Anmerkung Erstellen Sie Ihre individuelle Serializer zu erklären:

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MyMessageConverter{ 
} 

einrichten Komponente Scan für diese in Ihrer mvcconfiguration Datei

<context:include-filter expression="package.package.MyMessageConverter" 
      type="annotation" /> 

und Erstellen Sie eine Klasse, die implementiert.

@MyMessageConverter 
public MyConverter implements HttpMessageConverter<T>{ 
//do everything that's required for conversion. 
} 

Erstellen Sie eine Klasse, die extends AnnotationMethodHandlerAdapter implements InitializingBean.

public MyAnnotationHandler extends AnnotationMethodHandlerAdapter implements InitializingBean{ 
    //Do the stuffs you need to configure the converters 
    //Scan for your beans that have your specific annotation 
    //get the list of already registered message converters 
    //I think the list may be immutable. So, create a new list, including all of the currently configured message converters and add your own. 
    //Then, set the list back into the "setMessageConverters" method. 
    } 

Ich glaube, das ist alles, was für Ihr Ziel erforderlich ist.

Prost.

+0

Ich glaube, die Art, dass Sie darüber gehen, ist mehr von der "Jersey Way". – ninnemannk

+0

Diese Antwort hat so viel unnötige Komplexität. OP macht es richtig. – Bart

2

Sie sollten das entsprechende Modellfeld mit @JsonSerialize Annotation annotieren. In Ihrem Fall kann es sein:

public class MyMongoModel{ 
    @JsonSerialize(using=ObjectIdSerializer.class) 
    private ObjectId id; 
} 

Aber meiner Meinung nach sollte es besser keine Entity-Modelle als VOs verwenden. Besser ist es, verschiedene Modelle zu haben und zwischen ihnen zu mappen. Sie können my example project here finden (Ich verwendete Datum Serialisierung mit Spring 3 und Jackson 2 als Beispiel).

0

Es ist nicht erforderlich, einen Objekt-Mapper zu erstellen. Fügen Sie Ihrem Projekt jackson-core-2.0.0.jar und jackson-annotations-2.0.0.jar hinzu. Jetzt

, fügen Sie die folgenden Codezeilen zu dem Controller, während der Dienst Gabe:

@RequestMapping(value = "students", method = RequestMethod.POST, headers = "Accept=application/json", consumes = "application/json") 

public HashMap<String, String> postStudentForm(
      @RequestBody Student student, HttpServletResponse response) 

Sie nicht der Annotationen verpassen.

Verwandte Themen