I am trying to create a RESTful web-service and I created one but I am getting a

找不到媒体类型=application/json错误的MessageBodyWriter

我的Todo班:

package com.jersey.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.pojomatic.Pojomatic;
import org.pojomatic.annotations.AutoProperty;

@XmlRootElement
@XmlType(name = "todo")
@XmlAccessorType(XmlAccessType.FIELD)
@AutoProperty
public class Todo {

    @XmlElement(name = "summary")
    private final String summary;

    @XmlElement(name = "description")
    private final String description;

    public String getSummary() {
        return summary;
    }

    public String getDescription() {
        return description;
    }

    public Todo() {
        this(new Builder());    
    }

    public Todo(Builder builder) {
        this.summary = builder.summary;
        this.description = builder.description;
    }

    @Override
    public boolean equals(Object o) {
        return Pojomatic.equals(this, o);
    }

    @Override
    public int hashCode() {
        return Pojomatic.hashCode(this);
    }

    @Override
    public String toString() {
        return Pojomatic.toString(this);
    }

    public static class Builder {
        private String description;
        private String summary;

        public Builder summary(String summary) {
            this.summary = summary;
            return this;
        }

        public Builder description(String description) {
            this.description = description;
            return this;
        }

        public Todo build() {
            return new Todo(this);
        }
    }
}

我的资源是:-

package com.jersey.jaxb;

import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Path("/todo")
public class TodoResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getTodo(){
        Todo todo = new Todo.Builder().description("My Todo Object").summary("Created").build();
        return Response.status(Status.OK).entity(todo).build();
    }

}

我的网络.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/web-app_2_5.xsd" 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">
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<display-name>MyFirstWebService</display-name>
<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>com.jersey.jaxb</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Jersey REST Service</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

</web-app>  

My Libraries:

aopalliance-repackaged-2.4.0-b10.jar
asm-debug-all-5.0.2.jar
hk2-api-2.4.0-b10.jar
hk2-locator-2.4.0-b10.jar
hk2-utils-2.4.0-b10.jar
jackson-jaxrs-json-provider-2.2.3.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.4.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet.jar
jersey-container-servlet-core.jar
jersey-guava-2.17.jar
jersey-media-jaxb.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

When I run this application on Tomcat server and run this : http://localhost:8080/MyFirstWebService/rest/todo

I get the error:

严重:找不到媒体类型=application/json的MessageBodyWriter, type=class com.jersey.jaxb.TODO,GenericType=class com.jersey.jaxb.待办事项.

推荐答案

You have jackson-jaxrs-json-provider which is a start..

But...

这个人工制品仍然依赖于雅克斯康本身,它包括所有这些人工制品

在此处输入图像描述

That's why we use Maven[1] (so we don't have to worry about this kind of thing :-). So go find these.

Then just add the package to the web.xml, and it should work

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    com.jersey.jaxb,
    com.fasterxml.jackson.jaxrs.json
</param-value>

1. Maven依赖关系

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

或对上述依赖项使用下面的"包装器".它将注册Jackson提供者(因此我们不需要像上面那样明确注册),而Jackson例外映射器从2.17版开始提供Entity Data Filtering的支持

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

Note:通过Jersey的Auto-discovery feature,我们不必注册任何与上述依赖项相关的内容.如果出于某种原因禁用自动发现,您将需要显式注册JacksonFeature

Json相关问答推荐

中间初始化的Jolt配置

写入JSON文件的流

Terraform迭代JSON文件以获取键值对

如何在VB6中将字符串转换或解码为可读格式?

Ansible - 将文件内容添加到字典中

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

Jolt 转换数组对象并将某些字段移动到嵌套数组

使用 jq 从字符串列表开始创建对象

是否可以在有条件的情况下将 json 对象转换为 JOLT 中的数组?

Powershell JSON 操作

可以通过 POST 使用 EventSource 传递参数的服务器发送事件 (SSE)

ASP.NET MVC - 将 Json 结果与 ViewResult 结合起来

Python Flask-Restful POST 不采用 JSON 参数

json.dumps 打乱了顺序

Jackson 中的 readValue 和 readTree:何时使用哪个?

json和空数组

JSON 使用 simplejson 序列化 Django 模型

Protocol Buffer vs Json - 何时 Select 一个而不是另一个

通过 JSON 发送 64 位值的公认方式是什么?

我如何反序列化以杰克逊为单位的时间戳?