2014-11-02 8 views
6

एक बार मैं इस प्रश्न नवीनतम जर्सी उदाहरण दिए काम नहीं करता है, मैं एक जिज्ञासु समस्या में पड़:MediaType.APPLICATION_XML और MediaType.APPLICATION_JSON एक जर्सी डेमो आवेदन में

सर्वर, प्राप्त तरीकों ठीक काम करते हैं। मैंने परीक्षण किया और helloworld-pure-jax-rs उदाहरण के लिए कुछ परीक्षण कोड जोड़ा, और esp।

package org.glassfish.jersey.examples.helloworld.jaxrs; 

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.URI; 

import javax.ws.rs.core.UriBuilder; 
import javax.ws.rs.ext.RuntimeDelegate; 

import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

/** 
* Hello world application using only the standard JAX-RS API and lightweight 
* HTTP server bundled in JDK. 
* 
* @author Martin Matula (martin.matula at oracle.com) 
*/ 
@SuppressWarnings("restriction") 
public class App 
{ 

    /** 
    * Starts the lightweight HTTP server serving the JAX-RS application. 
    * 
    * @return new instance of the lightweight HTTP server 
    * @throws IOException 
    */ 
    static HttpServer startServer() throws IOException 
    { 
     // create a new server listening at port 8080 
     HttpServer server = HttpServer.create(new InetSocketAddress(getBaseURI().getPort()), 0); 

     // create a handler wrapping the JAX-RS application 
     HttpHandler handler = RuntimeDelegate.getInstance().createEndpoint(new JaxRsApplication(), 
       HttpHandler.class); 

     // map JAX-RS handler to the server root 
     server.createContext(getBaseURI().getPath(), handler); 

     // start the server 
     server.start(); 

     return server; 
    } 

    public static void main(String[] args) throws IOException 
    { 
     System.out.println("\"Hello World\" Jersey Example Application"); 

     HttpServer server = startServer(); 

     System.out.println("Application started.\n" + "Try accessing " + getBaseURI() 
       + "helloworld in the browser.\n" + "Hit enter to stop the application..."); 
     System.in.read(); 
     server.stop(0); 
    } 

    private static int getPort(int defaultPort) 
    { 
     final String port = System.getProperty("jersey.config.test.container.port"); 
     if (null != port) 
     { 
      try 
      { 
       return Integer.parseInt(port); 
      } 
      catch (NumberFormatException e) 
      { 
       System.out.println("Value of jersey.config.test.container.port property" 
         + " is not a valid positive integer [" + port + "]." 
         + " Reverting to default [" + defaultPort + "]."); 
      } 
     } 
     return defaultPort; 
    } 

    /** 
    * Gets base {@link URI}. 
    * 
    * @return base {@link URI}. 
    */ 
    public static URI getBaseURI() 
    { 
     return UriBuilder.fromUri("http://localhost/").port(getPort(8080)).build(); 
    } 
} 


public class Test 
{ 
    public int  age  = 0; 
    public String name = ""; 

    /** 
    * 
    */ 
    public Test() 
    { 
     super(); 
    } 

    /** 
    * @param age 
    */ 
    public Test(int age) 
    { 
     super(); 
     this.age = age; 
    } 

    /** 
    * @param name 
    */ 
    public Test(String name) 
    { 
     super(); 
     this.name = name; 
    } 

    /** 
    * @param name 
    * @param age 
    */ 
    public Test(String name, int age) 
    { 
     super(); 
     this.name = name; 
     this.age = age; 
    } 

    public int getAge() 
    { 
     return age; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setAge(int age) 
    { 
     this.age = age; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 
} 

package org.glassfish.jersey.examples.helloworld.jaxrs; 

import java.util.Collections; 
import java.util.HashSet; 
import java.util.Set; 
import javax.ws.rs.core.Application; 

public class JaxRsApplication extends Application 
{ 
    private final Set<Class<?>> classes; 

    public JaxRsApplication() 
    { 
     HashSet<Class<?>> c = new HashSet<Class<?>>(); 
     c.add(HelloWorldResource.class); 
     classes = Collections.unmodifiableSet(c); 
    } 

    @Override 
    public Set<Class<?>> getClasses() 
    { 
     return classes; 
    } 
} 

यह सादे पाठ के बाद संदेश के लिए ठीक काम करता है, लेकिन json fpr (MediaType.APPLICATION_JSON) और xml: वर्गों के बाकी IST यहाँ

package org.glassfish.jersey.examples.helloworld.jaxrs; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 


@Path("helloworld") 
public class HelloWorldResource 
{ 
    public static final String CLICHED_MESSAGE = "Hello World!"; 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getHello() 
    { 
     return CLICHED_MESSAGE; 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public String getHelloJson() 
    { 
     return "{ \"message\":" + CLICHED_MESSAGE + "}"; 
    } 

    @GET 
    @Produces(MediaType.TEXT_HTML) 
    public String getHelloHtml() 
    { 
     return "<html> " + "<title>" + "Hello Jersey" + "</title>" + "<body><h1>" + CLICHED_MESSAGE 
       + "</body></h1>" + "</html> "; 
    } 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    @Path("/v2") 
    public String getHello2() 
    { 
     return CLICHED_MESSAGE + " v2"; 
    } 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    @Path("/{id}") 
    public String getHelloId(@PathParam("id") String id) 
    { 
     return CLICHED_MESSAGE + " Parameter: " + id; 
    } 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    @Path("/id/{id : [a-zA-Z][a-zA-Z_0-9]}") 
    public String getHelloIdId(@PathParam("id") String id) 
    { 
     return CLICHED_MESSAGE + " Parameter: " + id; 
    } 

    @POST 
    @Consumes(MediaType.TEXT_PLAIN) 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response test(String test) 
    { 
     if (test.equals("test")) 
      return Response.status(400).entity("Error: " + test).build(); 
     return Response.status(200).entity(test).build(); 
    } 

    @POST 
    @Path("/test") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response testJSON(Test test) 
    { 
     String result = "Test JSON created : " + test.getName() + "" + test.getAge(); 
     // return result; 
     return Response.status(200).entity(result).build(); 
    } 

    @POST 
    @Path("/test") 
    @Consumes(MediaType.APPLICATION_XML) 
    @Produces(MediaType.APPLICATION_XML) 
    public Response testXML(Test test) 
    { 
     String result = "Test XML created : " + test.getName() + "" + test.getAge(); 
     // return result; 
     return Response.status(200).entity(result).build(); 
    } 

} 

: JSON के लिए एक पोस्ट अनुरोध जोड़ा भाग (MediaType.APPLICATION_XML) यह एक समर्थित मीडिया प्रकार बताते हुए विफल रहता है। कोई अंदाजा क्या गलत हो सकता है?

उत्तर

4

जेएक्स-आरएस में अंतर्निहित हैंडलर का एक समूह है जो कुछ अलग विशिष्ट जावा प्रकारों से और उसके लिए मार्शल कर सकता है।

एक बार जब हम कस्टम डेटा-बाइंडिंग (जावा ऑब्जेक्ट्स के लिए मार्शलिंग/अनमर्शलिंग) से निपटना शुरू करते हैं, तो हम एक अलग गेंद गेम में हैं। अब हमें कुछ अन्य MessageBodyWriters और MesageBodyReaders की आवश्यकता है।

सौभाग्य से, पहले ही पाठक और लेखक एक्सएमएल और जेएसओएन डेटा-बाध्यकारी के लिए उपलब्ध हैं। जेएक्स-आरएस एक मानक एक्सएमएल marshalling/unmarshalling के साथ आता है, एक चेतावनी के साथ .. हमें JAXB एनोटेशन का उपयोग करना चाहिए। JAXB प्रदाता unmarshall को/मार्शल, हम प्रदान करना चाहिए, कम से कम अनुमति देते हैं बनाने के लिए तो अपने Test वर्ग के लिए, यह सोचते हैं कि यह इस

public class Test { 
    private String name; 
    private int age; 

    public String getName() { return name; } 
    public void setName(String name) { this.name = name;} 
    public int getAge() { return age; } 
    public void setAge(int age) { this.age = age; } 
} 

तरह है, एक @XmlRootElement

@XmlRootElement 
public class Test { 
    .... 
} 

ऐसा अनुमति चाहिए काम करने के लिए एक्सएमएल।

जहाँ तक JSON के रूप में, JSON बाध्यकारी विनिर्देश का एक मानक बराबर नहीं है, लेकिन हम केवल परियोजना, जो स्वचालित रूप से JSON बाध्यकारी संभालने के लिए आवश्यक प्रदाता पंजीकृत करेंगे करने के लिए एक निर्भरता जोड़ सकते हैं। आप json-moxy उदाहरण के लिए pom.xml देख सकते हैं। आप इस के लिए आवश्यक निर्भरता

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
</dependency> 

क्या निर्भरता आवेदन करने की अनुमति देता देखेंगे, मार्शल/unmarshal JSON है/हमारे जावा वस्तुओं, JAXB टिप्पणियों का उपयोग करने से है। तो बस इस निर्भरता को pom.xml पर जोड़कर। आवेदन काम करना चाहिए। बस परीक्षण किया।

+0

त्वरित और बहुत ही उत्कृष्ट उत्तर के लिए धन्यवाद। अब काम करता है – user2737950

संबंधित मुद्दे