55

我是使用 JAX-RS 的新手,并编写了一个输出 json 对象的示例应用程序。但我遇到了一个例外。这是我的代码:

@Path("/hello")
public class HelloWorldService {

    @GET
    @Path("/query/{artist_id}")
    @Produces("application/json")
    public Data getMsg(@PathParam("artist_id") int artist_id,
                            @QueryParam("from") int from,
                            @QueryParam("to") int to) {
        Data d=new Data();
        d.setName("Mateen");
        d.setRoll(77);
        return d;

    }

}

我的数据只是一个 POJO 类:

@XmlRootElement
public class Data {
    private int roll;
    private String name;
    public int getRoll() {
        return roll;
    }
    public void setRoll(int roll) {
        this.roll = roll;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

我得到一个例外:

javax.ws.rs.WebApplicationException: 
    com.sun.jersey.api.MessageException: 
    A message body writer for Java class com.abc.data.Data, 
    and Java type class com.abc.data.Data, 
    and MIME media type application/json was not found

我究竟做错了什么 ?

4

6 回答 6

100

我终于找到了我的答案。我添加了

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.8</version>
</dependency>

到我的 pom.xml 文件。然后我加了

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

到我的 web.xml 文件,一切正常。我上面的代码不需要更改。

于 2012-10-28T11:48:28.470 回答
16

我添加了以下罐子,它对我有用

  • 杰克逊核心asl-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • 杰克逊-xc-1.9.2.jar
  • 杰克逊-jaxrs-1.9.2.jar
于 2013-07-12T08:23:56.120 回答
13

只是一个小小的补充。如果您不使用 web.xml 描述符文件,您可以通过编程方式启用 POJOMappingFeatire,如下所示

...
final ResourceConfig rc = new PackagesResourceConfig("com.test.resources");
    final Map<String, Object> config = new HashMap<String, Object>();
    config.put("com.sun.jersey.api.json.POJOMappingFeature", true);
    rc.setPropertiesAndFeatures(config);
...
于 2013-04-05T13:57:34.620 回答
5

Maven 用户:您只需要以下 2 个依赖项。

<!-- For Jersey --> 
<dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.15</version>
</dependency>

<!-- For JSON --> 
<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.15</version>    
</dependency>

默认情况下支持 XML 输出。所以它不需要依赖。

于 2015-02-12T21:58:54.447 回答
3

在使用 Jersey 1.8 时,我在创建 JSON 对象并从客户端访问 REST API 时遇到了同样的错误。

如果您在服务器端遇到问题,请确保您已在类路径中正确包含 jersey-json.jar 并在 web.xml 中映射正确的 init-param,如其他答案中所述。

对于客户端

根据Jersey 1.8 文档,以下代码段显示了如何在客户端使用 POJO JSON 映射功能:

 ClientConfig clientConfig = new DefaultClientConfig();
 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);
 Client client = Client.create(clientConfig);
于 2016-05-19T20:42:10.133 回答
0

我遇到了同样的问题:找不到 Java 类型、java.lang.String 类和 MIME 媒体类型 application/json 的消息正文编写器

问题是类 javax.ws.rs.ext.MessageBodyWriter 取自

<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22.2</version>
    </dependency>

与来自以下的同一个班级发生碰撞:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.19.1</version>
    </dependency>
于 2016-04-18T10:53:42.620 回答