java - 尝试通过JAX-RS Web服务发送JSON对象,获取“找不到媒体类型= application / json的MessageBodyWriter”





web-services rest (7)


它通过添加所有必需的杰克逊罐子为我工作。 添加了这些罐子

  • 杰克逊的注解-2.8.7.jar,
  • 杰克逊核心2.8.7.jar
  • 杰克逊 - 数据绑定 - 2.8.7.jar
  • 杰克逊 - JAXRS碱基2.8.7.jar
  • 杰克逊JAXRS JSON的提供商 - 2.8.3.jar
  • 杰克逊模块JAXB的注释 - 2.8.7.jar

我试图通过JAX-RS Web服务发送JSON对象。 我的文件web.xml是:

<servlet>
 <description>JAX-RS Tools Generated - Do not modify</description>
 <servlet-name>JAX-RS Servlet</servlet-name>
 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.notifire</param-value>
  </init-param>
  <init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>JAX-RS Servlet</servlet-name>
  <url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>

模拟我要发送的对象的类是:

public class GPSCoordinate {

private float latitudine;
private float longitudine;

 public float getLatitudine() {
    return latitudine;
}
public void setLatitudine(float latitudine) {
     this.latitudine = latitudine;
}
public float getLongitudine() {
    return longitudine;
}
public void setLongitudine(float longitudine) {
    this.longitudine = longitudine;
}
}

根类资源是:

@Path("position")
public class Position {

    @Context
private UriInfo context;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public GPSCoordinate getHTML() {

        GPSCoordinate coord = new GPSCoordinate();
        coord.setLatitudine(90.45f);
        coord.setLongitudine(34.56f);

        return coord;
    }
}

现在,当我尝试访问该服务时,我将浏览器指向以下链接

http://localhost:8080/Notifire/jaxrs/position

我收到以下错误:

消息org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型= application / json的MessageBodyWriter

在我的WEB-INF / lib文件夹中,我有最后一个版本的jersey JAX-RS实现(jaxrs-ri-2.5.jar)和jersey-json.jar存档。

任何帮助将非常感激。




这就是我解决这个问题的方法。

二手Jackson。 添加了这些罐子

将此类添加到我的项目中。 代码的关键行标记为重要。

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; <-- IMPORTANT
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;

//@javax.ws.rs.ApplicationPath("webresources")
public class MyApplicationConfig extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
    //addRestResourceClasses(resources);
    //resources.add(MultiPartFeature.class);
    //resources.add(JettisonFeature.class);
    return resources;
}

@Override
public Set<Object> getSingletons() {
    final Set<Object> instances = new HashSet<Object>();

    instances.add(new JacksonJsonProvider()); <--------- IMPORTANT
    return instances;
}
/**
 * Do not modify addRestResourceClasses() method.
 * It is automatically populated with
 * all resources defined in the project.
 * If required, comment out calling this method in getClasses().
 */
private void addRestResourceClasses(Set<Class<?>> resources) {
    //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
    //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);

}

}



我的根本原因略有不同。 我花了一些时间调试Jersey源代码,结果发现它由于缺少我的JAXB类中的默认构造函数而无法构造JAXBContext 。 它在搜索合适的MessageBodyWriter时发生,但不处理异常。

这是相应的代码片段(MOXyJsonProvider:324):

try {
    Set<Class<?>> domainClasses = getDomainClasses(genericType);
    return getJAXBContext(domainClasses, annotations, mediaType, null);
} catch(JAXBException e) {
    return null;
}

因此,如果您在POM中具有Moxy JSON依赖关系,请仔细检查您的JAXB类是否有效。

我正在使用的版本:Jersey 2.19,Moxy 2.6.0。




Jersey支持'autodiscoverable'功能,JSON支持就是其中之一。 根据文档 ,为了启用它,您需要在路径中添加兼容的库

然而,虽然推荐的jersey-media-json-processing库由于某种原因未能在我的案例中得到认可,但是jersey-media-moxy有:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.15</version>
</dependency>

2.15是撰写本文时的最新版本。 访问maven central artifact页面以查找当前版本。







尝试将Genson添加到类路径中,它将自动启用JSON支持。

Genson是json和java / scala的数据绑定和流式库。 它实现了JAX-RS的扩展点MessageBodyReader / Writer,允许jersey自动检测Genson并将其用于Json解析/写入。

你可以找到更多关于Gensons与JaxRS (jersey&cie) 整合的信息。










java json web-services rest jax-rs