2014-11-02 106 views
6

一旦我得到这个问题的最新球衣例如不起作用回答,我遇到了另一个问题感到好奇:MediaType.APPLICATION_XML和MediaType.APPLICATION_JSON在新泽西州的演示应用程序

服务器,GET方法做工精细。我测试并添加了一些helloworld-pure-jax-rs示例的测试代码,尤其是。增加了对JSON的POST请求:

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

} 

这里IST类的其余部分:

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

这对于纯文本消息后工作正常,但FPR的JSON(MediaType.APPLICATION_JSON)和XML部分(MediaType.APPLICATION_XML)失败,说明不支持媒体类型。任何想法可能是错的?

回答

4

JAX-RS有一堆内置的处理程序,可以从几个不同的 到特定的Java类型进行编组。

一旦我们开始处理自定义数据绑定(对Java对象进行编组/解组),我们将处于不同的球类游戏中。我们现在需要一些其他MessageBodyWritersMesageBodyReaders

幸运的是,已有读者和作者可用于XML和JSON数据绑定。 JAX-RS带有一个标准的XML编组/解组,我们必须使用JAXB注释。因此,对于你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; } 
} 

做出允许JAXB 提供商来解读/马歇尔,我们应该提供,至少,一个@XmlRootElement

@XmlRootElement 
public class Test { 
    .... 
} 

这样做应该允许XML工作。至于JSON,JSON绑定不是规范的标准参数,但我们可以简单地向项目添加一个依赖项,它将自动注册所需的提供程序来处理JSON绑定。您可以查看json-moxy示例的pom.xml。你会看到这需要依赖

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

什么的依赖性使应用程序做的,是元帅/解组JSON /从我们的Java对象,使用JAXB注释。所以只需将这个依赖添加到pom.xml即可。该应用程序应该工作。刚刚测试过。

+0

感谢您的快速和非常优秀的答案。现在工作。 – user2737950 2014-11-02 09:04:00