2014-10-22 17 views
5

Im utilizzando Jersey 2.x con conversione MOXy incorporata da JSON < -> POJO all'interno di un server Jetty 9.x incorporato.Serializzazione JSON personalizzata con Jersey 2.x/MOXy

È possibile definire una routine di serializzazione JSON (de) personalizzata per tipi specifici (ad esempio, Joda DateTime) a livello di codice (senza annotazioni sul POJO) - se sì, come?

Attualmente Ho il seguente codice per la configurazione Jersey con la mia istanza del server Jetty incorporato:

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/*"); 

e il suo bel lavoro per semplici POJO - voglio solo essere in grado di personalizzare il (de) serializzazione . C'è un modo per plugin di convertitori per tipi specifici, seguendo le linee di:

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

risposta

0

Penso che potrebbe essere interessato a this wiki article. La maggior parte riguarda la serializzazione XML, ma in fondo troverai come personalizzare la serializzazione JSON.

Fondamentalmente si crea un ContextResolver<JAXBContext> personalizzato che restituisce un numero personalizzato JSONJAXBContext che a sua volta ha un numero personalizzato JSONConfiguration. Non dimenticare di annotarlo con @Provider (e registrarlo nella tua Applicazione se necessario). Copierò il codice di esempio per completezza, non saprai mai per quanto tempo sopravviveranno queste cose :)

@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; 
    } 
}