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

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

 JAX-RS Tools Generated - Do not modify JAX-RS Servlet org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages it.notifire   com.sun.jersey.api.json.POJOMappingFeature true  1   JAX-RS Servlet /jaxrs/*  

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

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

任何帮助将非常感激。

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

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

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

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

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

  org.glassfish.jersey.media jersey-media-moxy 2.15  

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

使用客户端配置注册JacksonJsonProvier类,然后创建Client对象,这对我有用。 以下是代码。

  ClientConfig config = new ClientConfig(); config.register(JacksonJsonProvider.class); Client client = ClientBuilder.newClient(config); 

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

二手Jackson。 添加了这些jar子 在此处输入图像描述

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

 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> getClasses() { Set> resources = new java.util.HashSet>(); //addRestResourceClasses(resources); //resources.add(MultiPartFeature.class); //resources.add(JettisonFeature.class); return resources; } @Override public Set getSingletons() { final Set instances = new HashSet(); 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> 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时发生,但不处理exception。

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

 try { Set> 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。

转到https://jersey.java.net/documentation/2.5.1/user-guide.html#json

你需要完成你的课程…… JAXB需要这样,例如:

 @XmlRootElement public class MyJaxbBean { @XmlElement(name="king") public String name; @XmlTransient public int age; // several lines removed } 

它通过添加所有必需的jacksonjar子为我工作。 添加了这些jar子

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