2015-01-15 5 views
5

मैं एक्लीप्से के बाहर जेट्टी जर्सी और जैक्सन को चलाने की कोशिश कर पागल हो रहा हूं।जेट्टी + जर्सी + जैक्सन, एक्लिप्स (सफलता) बनाम कमांड लाइन में भिन्न व्यवहार (त्रुटि असमर्थित मीडिया प्रकार)!

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

एक 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}"; 
    } 
} 

और एक इकाई (unserialize करने के लिए) वर्ग:

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

अब यह अजीब हिस्सा आता है

मैं एक मुख्य वर्ग है । मैं पोस्टमैन का उपयोग 8089 पोर्ट पर POST याचिका भेजकर और {"flag" : "true"} के कच्चे JSON मान को सामग्री-प्रकार और पर्याप्त रूप से सेट स्वीकार करने के साथ उपभोग करने के लिए जेएसओएन का परीक्षण करने के लिए करता हूं।

जब मैं सही ढंग से ग्रहण सर्वर जवाब के माध्यम से मुख्य वर्ग खेलते हैं, लेकिन जब मैं CLI (mvn साफ पैकेज + जावा -cpJar main_class) में यह कर, सर्वर का जवाब देता त्रुटि 415: Unsuported मीडिया प्रकार

मेरे सरल 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> 

क्या हो रहा है इसके बारे में कोई सुझाव?

संपादित करें: मैंने थोड़ा सा समस्या संकुचित की। Com.fasterxml.jackson.jaxrs.json की तरह लगता है। जैकसन जेसनप्रोवाइडर पंजीकरण नहीं कर रहा है जब ऐप को कंसोल से निष्पादित किया जाता है। मैं इसे मैन्युअल रूप से कैसे पंजीकृत कर सकता हूं?

उत्तर

2

मुझे सच में यकीन नहीं है कि आईडीई और जार से कमांड लाइन से चलने के बीच क्या अंतर है, लेकिन मैं एक ही समस्या को पुन: उत्पन्न करने में सक्षम था। मैं ऊपर अपने कोड का उपयोग करने की कोशिश की, और से 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(); 
    } 
} 

भी कोड एक ही रास्ता मैं यह काम प्राप्त करने में सक्षम था मेरे कोड उदाहरण के साथ था, लेकिन स्पष्ट रूप से JacksonFeature

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

मैं दर्ज की जैक्सन पैकेज के लिए स्कैन करने के लिए एक इनिट-पैरा सेट करने की भी कोशिश की, जो कि काम नहीं करता था।

2

उबेर जार में जर्सी की बाकी सेवाओं को निष्पादित करते समय मुझे भी यही समस्या थी। मैं निम्नलिखित लेख का उपयोग करके इसे ठीक करने में सक्षम था। उम्मीद है कि यह किसी की मदद कर सकता है। JSON example with Jersey + Jackson

ऊपर उदाहरण जर्सी 1.x में लिखा गया था। यहां जर्सी 2.x कार्यान्वयन है।

जोड़ें web.xml

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

में अपने पोम

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

और निम्नलिखित init-param जोड़ने के लिए निम्नलिखित जर्सी जैक्सन निर्भरता या आप स्पष्ट रूप से उल्लेख किया @peeskillet तरह जैक्सन सुविधा रजिस्टर कर सकते हैं।

ResourceConfig config = new ResourceConfig(); 
config.register(JacksonFeature.class); 
संबंधित मुद्दे