2014-10-22 6 views
5

Im mit Jersey 2.x mit eingebauter MOXy Konvertierung von JSON < -> POJO innerhalb eines eingebetteten Jetty 9.x-Server.Benutzerdefinierte JSON-Serialisierung mit Jersey 2.x/MOXy

Ist es möglich, eine benutzerdefinierte JSON (De) Serialisierungsroutine für bestimmte Typen (z. B. Joda DateTime) programmgesteuert (ohne Anmerkungen auf dem POJO) zu definieren - wenn ja, wie?

Zur Zeit habe ich den folgenden Code bekommt für die Konfiguration von Jersey mit meiner eingebetteten Jetty-Server-Instanz:

ResourceConfig resourceConfig = new ResourceConfig(); 
    resourceConfig.packages("com.company.app.rest.v1"); 
    resourceConfig.register(new GZipEncoder()); 
    resourceConfig.register(new LoggingFilter()); 
    ServletHolder servletHolder = new ServletHolder(new ServletContainer(resourceConfig)); 

    context.addServlet(servletHolder, "/rest/v1/*"); 

und seine adaequat für einfache POJOs - Ich möchte nur in der Lage sein, die (de) Serialisierung anpassen . Gibt es eine Möglichkeit Konverter für bestimmte Arten Plugin, entlang der Linien von:

registerTypeConverter(MySpecificType.class, CustomReader.class, CustomWriter.class); 

Antwort

0

Ich glaube, Sie könnten in this wiki article interessiert. Das meiste beschäftigt sich mit der XML-Serialisierung, aber unten finden Sie, wie Sie die JSON-Serialisierung anpassen können.

Grundsätzlich erstellen Sie eine benutzerdefinierte ContextResolver<JAXBContext>, die eine benutzerdefinierte JSONJAXBContext zurückgibt, die wiederum eine benutzerdefinierte JSONConfiguration hat. Vergessen Sie nicht, es mit @Provider zu kommentieren (und registrieren Sie es bei Bedarf in Ihrer Anwendung). Ich werde den Beispielcode auf Vollständigkeit kopieren, man weiß nie, wie lange diese Dinge überleben :)

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private JAXBContext context; 
    private Class[] types = { Address.class, Customer.class, CustomerResource.class }; 

    public JAXBContextResolver() throws Exception { 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types); 
    } 

    public JAXBContext getContext(Class<?> objectType) { 
     for (Class type : types) { 
      if (type == objectType) { 
       return context; 
      } 
     } 
     return null; 
    } 
}