1

我正在尝试使用 Jersey 创建一个非常简单的 RESTful Web 服务。我正在尝试使它通过使用 JAXB 来消耗和生成 JSON。问题是当我将 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

在此处输入图像描述

我对此很陌生,这没有多大意义。希望你们中的一个人能够帮我一把。谢谢!

4

5 回答 5

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 的 Jackson:

<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。

于 2013-11-04T23:30:40.110 回答
1

将此添加到您的 web.xml

<init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

有关更多详细信息,请查看球衣文档:https ://jersey.java.net/documentation/1.18/json.html

于 2014-04-24T06:15:50.700 回答
1

JAXB(用于 XML 绑定的 Java 体系结构)在 java 中可用于绑定 xml 而不是JSON 。在这里,您尝试在这种情况下借助xml 绑定器转换JavaScript 对象表示法,这是不可能的。而且我很确定您一定会收到由JAX-RS 包中的“ BodyWriter 类”生成的错误....

无论如何,如果您想使用您的资源生成和使用 JSON,您将需要项目库中可用的“ moxy ”JAR 来处理此转换:)

希望我在这里写的内容对其他程序员有所帮助

于 2015-10-20T13:41:32.157 回答
0

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

确保您的请求获得标头“内容类型”?application/json 并且标题“accept”包含 text/html

于 2014-01-27T15:08:35.450 回答
0

我认为,您的 Request 模型类有问题。您的模型类未指定 @XmlaccessType,因此默认情况下它被视为 PUBLIC_MEMBER。由于您的实例变量与 getter 和 setter 一样也是公共的,因此 JAXB 无法找出正确的绑定。这就是出现异常的原因。因此,您的问题有两个解决方法。

1)您可以将您的实例变量设为私有。2)或者您可以为您的模型类显式指定@XmlaccessType,并同样在其中提供不冲突的注释。

于 2014-04-24T05:57:22.137 回答