2013-11-04 57 views
1

我正在尝试使用Jersey创建一个非常简单的RESTful Web服务。我试图使它通过使用JAXB消耗并产生JSON。问题是,当我传递一个JSON给它时,我得到一个错误。使用JAXB解析Jersey中的JSON

以下是资源代码。 status()和echo()都可以正常工作。请注意,在processRequest()我目前正在生成一个文本响应,但稍后将更改生成一个JSON。

package web_service; 

import javax.ws.rs.*; 
import javax.ws.rs.core.*; 

@Path("/") 
public class WebService { 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String status() { 
     return "Web service is up and running."; 
    } 

    @POST 
    @Consumes(MediaType.TEXT_PLAIN) 
    @Produces(MediaType.TEXT_PLAIN) 
    public String echo(String consumed) { 
     return consumed; 
    } 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.TEXT_PLAIN) 
    public String processRequest(JAXBElement<Request> r) { 
     Request request = r.getValue(); 
     return "Latitude: " + request.latitude + 
      "\n:Longitude: " + request.longitude; 
    } 
} 

这是请求模式:

package web_service; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Request { 

    public String latitude; 
    public String longitude; 

    public Request() {} 

    public Request(String latitude, String longitude) { 
     this.latitude = latitude; 
     this.longitude = longitude; 
    } 

    // Getters and setters for both 
} 

我的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5"> 

    <servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 

     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>web_service</param-value> 
     </init-param> 

     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

最后,这是我做的(头设置为POST的例子'Content-Type:application/json');

{ 
    "latitude":"25.764084501106787", 
    "longitude":"-80.37422332275389" 
} 

当我运行此,Tomcat的给了我以下异常:

WARNING: WebApplicationException cause: 
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=class web_service.Request, genericType=class  web_service.Request. 

我也得到如下回应:

415 Unsupported Media Type 

Content-Length: 1 kB 
Content-Type: text/html;charset=utf-8 
Date:   2013 Nov 4 17:41:20 
Server:   Apache-Coyote/1.1 

enter image description here

我很新对此,这不是很有意义。希望你们中的一个能够帮我一把。谢谢!

回答

1

试试这个在您的端点:

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.TEXT_PLAIN) 
public String processRequest(Coordinates coordinates) { 
    return "Latitude: " + coordinates.getLatitude() + 
     "\n:Longitude: " + coordinates.getLongitude(); 
} 

其中Coordinates是一个简单的POJO镜像您发布的内容JSON。

然后用杰克逊,其中有JAXB支持,通过将所有的库到您的项目并添加该配置:

<init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value> 
</init-param> 

的“泽西REST服务”的servlet。

+0

我得到确切同样的错误。 – fpele

+0

尝试使用我提供的配置。 – Vidya

+1

不是。我将所有的Jackson jar,配置添加到web.xml,并将Request转换为POJO。我一直得到相同的错误:'找不到media_type = application/json的MessageBodyReader,type = class web_service.Request,genericType = class web_service.Request.'和'HTTP Status 415 - Unsupported Media Type' – fpele

0

当您请求没有指定标头时,会发生此错误。 在服务 @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN)

确保您的请求得到头 “内容类型”?应用程序/ json和标题“接受”包含文本/ html

0

我认为,您的请求模型类存在问题。您的模型类没有指定@XmlaccessType,因此默认情况下它将被视为PUBLIC_MEMBER。由于你的实例变量也随着getter和setter一起公开,因此JAXB无法找出正确的绑定。这就是为什么这个异常即将到来。所以有两个修复你的问题。

1)您可以将您的实例变量设置为私有。 2)或者你可以为你的模型类显式地指定@XmlaccessType,并且在其中提供非冲突的注解。

1

JAXB(Java体系XML绑定)在Java中avaialable结合XML不是JSON。在这里,你正试图转换JavaScript对象表示法xml绑定器的帮助下,在这种情况下,这是不可能的。我很确定你必须得到由JAX-RS包中的“BodyWriter class”生成的错误....

无论如何如果你想要使用你的资源来生产和使用JSON,你需要“ MOXY在项目库“JAR可用于发放这种转换:)

希望我正在写在这里将有利于其他程序员