2015-01-15 17 views
5

Jetty Jersey ve Jackson'ı Eclipse'nin dışına çıkarmaya çalışırken çıldırıyorum.Jetty + Jersey + Jackson, Eclipse (Success) vs komut satırındaki farklı davranış (Hata Desteklenmeyen Ortam Türü)!

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(); 
    } 
} 

bir uç nokta sınıfı:

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

ve Varlığı (nesneleştirmek) sınıfı:

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

Şimdi komik kısım geliyor

Ben bir ana sınıf var . Her iki İçerik türünde ve Kabul seçeneğiyle 8089 bağlantı noktasına bir POST dilekçesi ve {"flag" : "true"} ham JSON değeri göndererek JSON tüketimini test etmek için Postman'ı kullanıyorum. Unsuported Medya Türü

Benim basit: Ben doğru Tutulma sunucu cevapları yoluyla Ana sınıfı oynamak ama CLI (mvn temiz paket + java -cpJar MAIN_CLASS) 'de bunu yaparken, sunucu Hata 415 cevapları

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> 

Olanlar ile ilgili herhangi bir öneriniz var mı?

DÜZENLEME: Biraz sorunu daralttım. Uygulama, konsol konsolundan yürütüldüğünde com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider gibi görünmüyor. Bunu nasıl manuel olarak kaydedebilirim?

cevap

2

IDE ve jar komut satırından kaçış arasında ne fark olduğundan emin değilim, ama aynı sorunu yeniden üretebildim. Yukarıda kodunuzu kullanmaya çalıştı ve 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(); 
    } 
} 

dan da kod benim kod örneği oldu ben o işi elde edebildi tek yolu, ancak açıkça JacksonFeature

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

I kayıt hatta, Jackson paketini taramak için bir init-param ayarlamaya çalıştı, bu da işe yaramadı.

2

Uber jar'da jersey dinlenme hizmetlerini yürütürken aynı sorunu yaşadım. Bunu aşağıdaki makaleyi kullanarak çözebildim.Hope bu birisine yardımcı olabilir. JSON example with Jersey + Jackson

Örnek yukarıda jersey 1.x.Here'de yazılmıştır. Jersey 2.x uygulamasıdır. web.xml

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

daki pom init-param aşağıdaki

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

Ve eklemek için

Ekleme aşağıdaki forma jackson bağımlılık veya açıkça belirtilen @peeskillet gibi jackson özelliğini kaydedebilirsiniz.

ResourceConfig config = new ResourceConfig(); 
config.register(JacksonFeature.class); 
İlgili konular