2015-01-20 25 views
5

Abbiamo un'applicazione JAX-RS che gira su Apache TomEE. Personalizziamo leggermente il provider Jettison predefinito per aderire meglio alle convenzioni JSON utilizzate dal front-end JavaScript. TomEE permette di farlo attraverso il suo file resources.xml:Personalizzazione di JSON marallall con GlassFish v4

<resources> 
    <Service id="jettison" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider"> 
     serializeAsArray = true 
     dropRootElement = false 
     arrayKeys = members,roles 
     supportUnwrapped = true 
     writeXsiType = false 
    </Service> 
</resources> 

Ora stiamo migrando a GlassFish v4.1, e notiamo che l'uscita JSON è diverso da quello che avevamo in TomEE - così frontend completamente rottura. Sto cercando un meccanismo simile per personalizzare il marshaller JSON in GlassFish. In effetti, sono già un po 'stuck con Jersey, MOXy, Jackson, Jettison. Come facciamo a sapere quale fornitore JSON è effettivamente utilizzato? Come ne selezioniamo uno? Come personalizziamo il comportamento?

L'applicazione è pura JAX-RS e non utilizza alcun processore JSON direttamente, affidandosi invece al marshalling delle classi con annotazione JAXB. L'introduzione di qualsiasi dipendenza non JavaEE è altamente indesiderabile, dal momento che l'applicazione è concepita per essere portabile su container (TomEE, GlassFish, alcuni giorni WildFly). Il metodo del file di configurazione, simile a TomEE, è preferibile; Anche la modalità programmatica è accettabile, ma solo se viene mantenuta la portabilità.

risposta

2

Glassfish utilizza MOXy come provider predefinito. Internamente lo ha le librerie per gestire Jackson, Jettison e MOXy, ma il valore predefinito è MOXy. Ci sono due modi per disattivare Moxy

  1. Impostare la proprietà Jersey jersey.config.server.disableMoxyJson a true.
  2. Registrare un diverso XxxJsonFeature che disabilita MOXy. Ad esempio, la JacksonFeature che viene fornito con jersey-media-json-jackson

noti che Glassfish viene fornito con un fornitore di Jackson, ma è Jackson 1.x. Se si desidera utilizzare 2.x, al posto del usando la dipendenza jersey-media-json-jackson di cui sopra, sarebbe meglio usare il sottostante Jackson dipendenze fornitore, che è

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.6.0</version> 
</dependency> 

È possibile registrare il JacksonJsonProvider o JacksonJaxbJsonProvider per JAXB supporto di annotazione.

Per configurare Jackson, il modo più semplice per implementare un ContextResolver, come si vede nella this answer. Lo JacksonJsonProvider cercherà questo ContextResolver per recuperare lo ObjectMapper utilizzato per la (de) serializzazione.

Sarà inoltre necessario ricordare di disabilitare MOXy, come indicato sopra.

Un'altra cosa da notare è che questa soluzione è portatile. Con JAX-RS, l'unica configurazione applicazione portatile è attraverso un Application sottoclasse

@ApplicationPath("/api") 
public class MyApplication extends Application {} 

Detto, la disabilitazione della Moxy nel caso di Glassfish, non è altro che imposta una proprietà. Nella classe Application, è possibile eseguire l'override di getProperties() che restituisce uno Map<String, Object>. Questo è dove è possibile impostare la proprietà.E perché è niente di più di una stringa (senza dipendenze esterne), rimane portatile

@ApplicationPath("/api") 
public class MyApplication extends Application { 
    @Override 
    public Map<String, Object> getProperties() { 
     Map<String, Object> props = new HashMap<>(); 
     props.put("jersey.config.server.disableMoxyJson", true); 
     return props; 
    } 
} 

Per quanto riguarda il sopra Jackson dipendenza, è anche una soluzione portatile. It it nothing (JAX-RS) implementazione specifica. Implementa e utilizza le API standard JAX-RS

+0

Scoprire 'jersey.config.server.disableMoxyJson' mi ha portato come un giorno. Finalmente ho il mio provider Gson funzionante. Grazie! –