2013-07-07 2 views
6

Uso Jersey per produrre JSON (con mapping POJO tramite Jackson) e Jetty (inizia con il metodo principale).
Funziona perfetto per Jersey 1.x .:Impossibile abilitare il supporto per JSON basato su POJO per Jackson in Jersey 2.0

ServletHolder sh = new ServletHolder(ServletContainer.class); 
sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", 
         "com.sun.jersey.api.core.PackagesResourceConfig"); 
sh.setInitParameter("com.sun.jersey.config.property.packages", "service"); 
sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); 
... 
context.addServlet(sh, "/rest/*"); 
Server server = new Server(8080); 
server.setHandler(context); 
server.start(); 

Ora ho migrato il mio progetto a Jersey 2.0 e non è riuscito ad abilitare POJO basato vincolante JSON in esso, ottengo il seguente: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class business.entity.ExampleEntity, genericType=class business.entity.ExampleEntity.

Ovviamente , com.sun.jersey.api.json.POJOMappingFeature non è più valida come Jersey va a org.glassfish

il documentation dire quanto segue:

Per poter utilizzare Jackson come JSON (JAXB/POJO) fornitore è necessario registrarsi JacksonFeature e un ContextResolver per ObjectMapper (se necessario) nel configurabile (client/server).

Ma non riesco a capire come farlo correttamente nel mio caso.

ho creato un po 'project per questa domanda:

ramo master - ha lavorato per esempio Jersey 1.17.1;

ramo jersey-2.0-migration - non funziona tentativo di migrare a Jersey 2.0 - test fallito;

succursale jersey-2.0-migrate-client-only - tentativo non funzionante per utilizzare il client Jersey 2.0 con server Jersey funzionante 1.17.1 - test fallito.

La domanda è: come abilitare obbligatorio in Jersey 2,0

risposta

15

La documentazione è un po 'obsolete JSON basato POJO. L'ultima Jackson costruzione fornisce un provider di auto-rilevabile. Aggiungere i seguenti vasi al percorso classe:

1) Jackson-annotazioni-2.2.2.jar

2) jackson-core-2.2.2.jar

3) Jackson-databind-2.2 .2.jar

4) Jackson-jaxrs-base-2.2.1.jar

5) Jackson-jaxrs-json-provider-2.2.1.jar

6) Jackson-module- JAXB-annotazioni-2.2.2.jar

Assicurarsi di aggiungere "com.fasterxml.jackson.jaxrs.json" alla proprietà di configurazione del servlet "jersey.config.server.provider.packages", in modo che il provider di Jackson Jackson possa essere rilevato automaticamente.

+0

Ha funzionato per me! Grazie tante! Ho aggiunto due nuovi rami al mio piccolo [progetto] (https://github.com/halfstrik/Jersey20Migration/tree/jersey-2.0-migration-success) su GitHub 'jersey-2.0-migrate-server-success' e' jersey -2.0-migration-success' descrivono la soluzione e ha superato il test! – Strikki

+0

Anche io lavoro con 'jersey-media-json-jackson 2.0 '(vedi aggiornamento su' jersey-2.0-migration'), ma senza 'jersey-client 2.0' riceve avvertenze come menzionato in [commenti] (http: //stackoverflow.com/a/16993761/846325) – Strikki

+0

Ore di angoscia perse. Moxy stava fallendo silenziosamente e io dovevo tornare a Jackson e io ero pronto a mettere la mia testa attraverso una finestra. Grazie per questa risposta. – JSager

3

Personalmente mi è piaciuto il commento/risposta di @ jontro ... quindi ho intenzione di ripubblicarlo come risposta piuttosto che come commento in modo che le persone non lo perdano (si spera che sia ok).

Dai uno sguardo a https://github.com/FasterXML/jackson-jaxrs-providers dove ci sono nuovi fornitori di jackson jaxrs (dal progetto jackson piuttosto che dal progetto jersey).

Si noti che questo porta alle dipendenze di Jackson2 (jackson-core-2.2.3.jar ecc.) Piuttosto che alle dipendenze di Jackson1 introdotte da jersey-media-json-jackson (jackson-core-asl-1.9.13.jar ecc.).

Per il mio progetto Maven usando maglia 2.5 ciò si traduce in:

rimuovere la dipendenza:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.5.1</version> 
</dependency> 

Aggiungere la dipendenza:

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

Grazie a @ user2562639 e @jontro.