线程"main"中的异常javax.ws.rs.NotAcceptableException:HTTP 406不可接受

Alf*_*bel 5 java rest jax-rs jersey jackson

执行REST客户端时出现以下异常:

InboundJaxrsResponse{ClientResponse{method=GET, uri=http://localhost:8080/com.dcr.jersey.first/webapi/todo, status=406, reason=Not Acceptable}}
Exception in thread "main" javax.ws.rs.NotAcceptableException: HTTP 406 Not Acceptable
Run Code Online (Sandbox Code Playgroud)

在Web浏览器上(当tomcat运行时),URL:http:// localhost:8080/com.dcr.jersey.first/webapi/todo给出输出

todo>
<description>This is my first todo - Description</description>
<summary>This is my first todo - Summary</summary>
</todo>
Run Code Online (Sandbox Code Playgroud)

但运行客户端代码会抛出异常,这里缺少的映射是什么?,感谢您的指导(包括所有代码示例)

这是web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
<!--                <param-value>com.dcr.jersey</param-value> -->
<!--             <param-value>com.dcr.jersey.first</param-value> -->
                <param-value>com.dcr.jersey.jaxb.model</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)

这是执行的TodoResourceCliient:

package com.dcr.jersey.client;

import java.net.URI;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;

import org.glassfish.jersey.client.ClientConfig;

public class TodoResourceCliient {


    public static void main(String[] args) {
        ClientConfig config = new ClientConfig();
        Client client = ClientBuilder.newClient(config);
        WebTarget target = client.target(getBaseURI());

                System.out.println(target.path("webapi").path("todo").request()
                        .accept(MediaType.TEXT_PLAIN).get(Response.class)
                        .toString());

                System.out.println(target.path("webapi").path("todo").request()
                        .accept(MediaType.TEXT_HTML).get(String.class));

                System.out.println(target.path("webapi").path("todo").request()
                        .accept(MediaType.TEXT_XML).get(String.class));

                System.out.println(target.path("webapi").path("todo").request()
                        .accept(MediaType.TEXT_PLAIN).get(String.class));

                System.out.println(target.path("webapi").path("todo").request()
                        .accept(MediaType.APPLICATION_JSON).get(String.class));
    }

    private static URI getBaseURI() {

        return UriBuilder.fromUri("http://localhost:8080/com.dcr.jersey.first").build();

      }

}
Run Code Online (Sandbox Code Playgroud)

TodoResource.java:

package com.dcr.jersey.jaxb.model;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/todo")
public class TodoResource {
    @GET
      @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
      public Todo getXML() {
        Todo todo = new Todo();
        todo.setSummary("This is my first todo - Summary\n");
        todo.setDescription("This is my first todo - Description\n");
        return todo;
      }
      // This can be used to test the integration with the browser
      @GET
      @Produces({ MediaType.TEXT_XML,MediaType.TEXT_PLAIN,MediaType.TEXT_HTML})
      public Todo getHTML() {
        Todo todo = new Todo();
        todo.setSummary("This is my first todo - Summary\n");
        todo.setDescription("This is my first todo - Description\n");
        return todo;
      }
}
Run Code Online (Sandbox Code Playgroud)

Todo.java:

package com.dcr.jersey.jaxb.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement

public class Todo {

    private String summary;
    private String description;

    public String getSummary() {
        return summary;
    }
    public void setSummary(String summary) {
        this.summary = summary;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }


}
Run Code Online (Sandbox Code Playgroud)

来自Console的Stacktrace:

InboundJaxrsResponse{ClientResponse{method=GET, uri=http://localhost:8080/com.dcr.jersey.first/webapi/todo, status=500, reason=Internal Server Error}}
Exception in thread "main" javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1002)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:799)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:91)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:687)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:683)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:411)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:307)
    at com.dcr.jersey.client.TodoResourceCliient.main(TodoResourceCliient.java:27)
Run Code Online (Sandbox Code Playgroud)

pom.xml中包含的依赖项:我是否缺少任何依赖项?

<dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
<!--          JSON support -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
        </dependency>

    </dependencies>
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 7

查看Http 状态代码

406 不可接受

请求标识的资源只能根据请求中发送的accept头生成具有不可接受的内容特征的响应实体。

.accept(mediatype)Accept为请求设置标头的内容。您目前有五个请求,每个请求都接受不同的类型

MediaType.TEXT_PLAIN,MediaType.TEXT_HTML , MediaType.TEXT_XML, MediaType.TEXT_PLAIN,MediaType.APPLICATION_JSON

这是工作中的内容协商。这个服务器端的配置是使用@Produces(它与Accept标题相关)和@Consumes(与Content-Type标题相关)。

话虽如此,请查看您的所有@Produces注释。您目前只支持制作媒体类型

MediaType.APPLICATION_XML, MediaType.TEXT_XML,MediaType.APPLICATION_JSON

缺少的在上面以粗体显示。删除那些,如果其他一切都是正确的,这应该适合你。