2015-01-15 19 views
5

Sto diventando pazzo cercando di gestire Jetty Jersey e Jackson all'esterno di Eclipse.Jetty + Jersey + Jackson, comportamento differente in Eclipse (Success) contro riga di comando (Errore tipo di supporto non supportato)!

Ho una classe principale:

public class Main { 

    public static void main(String[] args) throws Exception { 

     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*").setInitParameter(
      "jersey.config.server.provider.classnames", CanaryEndpoint.class.getCanonicalName()); 

     Server jettyServer = new org.eclipse.jetty.server.Server(8089); 
     jettyServer.setHandler(context); 
     jettyServer.start(); 
     jettyServer.join(); 
    } 
} 

Una classe endpoint:

@Path("/endpoint") 
public class CanaryEndpoint { 

    @POST 
    @Path("/test") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public String canaryTest(ValueWrapper param) { 
     System.out.println("Deserialized Property: " + param.isFlag()); 
     return "{OK}"; 
    } 
} 

e di un (a unserialize) Classe Entity:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class ValueWrapper { 
    @XmlElement 
    public boolean flag; 

    public ValueWrapper() {} 
    public boolean isFlag()   { return flag; } 
    public void setFlag(boolean flag) { this.flag = flag;} 
} 

Ora viene la parte divertente . Uso Postman per testare il consumo JSON inviando una petizione POST alla porta 8089 e un valore JSON raw di {"flag" : "true"} sia con Content-type sia con Accept adeguatamente impostato.

Quando gioco Classe principale attraverso le risposte dei server eclisse in modo corretto, ma quando lo faccio nella CLI (mvn pacchetto pulito + java -cpJar main_class), il server risponde Errore 415: Unsuported tipo di supporto

mio semplice pom.xml:

<jersey.version>2.14</jersey.version> 
<jetty-version>9.2.6.v20141205</jetty-version> 
(...) 
<artifactId>jetty-server</artifactId> 
<artifactId>jetty-servlet</artifactId> 
<artifactId>jersey-container-servlet-core</artifactId> 
<artifactId>jersey-json</artifactId> 
<artifactId>jersey-media-json-jackson</artifactId> 

Qualche suggerimento su cosa sta succedendo?

MODIFICA: Ho ristretto un po 'il problema. Sembra com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider non si registra quando l'app viene eseguita dalla console. Come posso registrarlo manualmente?

risposta

2

Non sono sicuro di quale sia la differenza tra l'esecuzione da IDE e il jar dalla riga di comando, ma sono riuscito a riprodurre lo stesso problema. Ho cercato di utilizzare il codice di cui sopra, e anche il codice da this answer

public class TestJerseyServer { 
    public static void main(String[] args) throws Exception { 
     ResourceConfig config = new ResourceConfig(); 
     config.packages("jetty.practice.resources"); 
     ServletHolder jerseyServlet 
         = new ServletHolder(new ServletContainer(config)); 

     Server server = new Server(8080); 
     ServletContextHandler context 
       = new ServletContextHandler(server, "/"); 
     context.addServlet(jerseyServlet, "/*"); 
     server.start(); 
     server.join(); 
    } 
} 

L'unico modo sono stato in grado di farlo lavoro è stato con il mio esempio di codice, ma la registrazione in modo esplicito il JacksonFeature

ResourceConfig config = new ResourceConfig(); 
config.register(JacksonFeature.class); 

I ho anche provato a impostare un init-param per la scansione del pacchetto Jackson, che non ha funzionato neanche.

2

Ho avuto lo stesso problema durante l'esecuzione di servizi di jersey in uber jar. Sono riuscito a risolvere il problema usando il seguente articolo. Questo potrebbe aiutare qualcuno. JSON example with Jersey + Jackson

Sopra l'esempio è stato scritto nella maglia 1.x.Qui è l'implementazione della maglia 2.x.

Add seguente maglia jackson dipendenza al vostro pom

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

E aggiungere seguente init-param in web.xml

<init-param> 
<param-name>jersey.config.server.provider.classnames</param-name> 
<param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value> 
</init-param> 

o si può registrare in modo esplicito la funzione Jackson come @peeskillet menzionato.

ResourceConfig config = new ResourceConfig(); 
config.register(JacksonFeature.class);