当前位置: 首页 > 知识库问答 >
问题:

泽西Restful Web服务-MessageBodyProviderNotFoundException

秦昂然
2023-03-14

我是JavaWeb服务的新手,我正在努力解决一个基本问题。

在找到了一堆过时的示例后,我设法找到了一些使用XML的方法,但是当我要求它返回JSON时,相同的代码就不起作用了。

起初我认为它缺少JSON格式化程序,但JAXB应该负责从POJO到JSON的转换,所以我认为这不是问题所在。

Tomcat中引发的错误是:

javax.servlet.ServletException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class resttest.model.Todo, genericType=class resttest.model.Todo

网状物。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">
  <display-name>testtest</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>resttest.jaxb;resttest.model</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app> 

Todo.java

package resttest.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Todo {

    public 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;
  } 
}

TodoResource。Java语言

package resttest.jaxb;

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

import resttest.model.Todo;

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

  @GET
  @Produces("application/json")
  public Todo getTodo() {
    Todo todo = new Todo();
    todo.setSummary("This is my first todo");
    todo.setDescription("This is my first todo");
    return todo;
  }

} 

你知道为什么JSON没有被返回和抛出错误吗?

共有3个答案

边国安
2023-03-14

您已经在todo类的类级别提到了XmlRootElement<只有当您希望以xml格式生成响应,并且在TodoResource类的方法级别提供路径时,才需要使用code>@XmlRootElement,这是一种很好的做法。在方法级别提到products(MediaType.APPLICATION\u JSON)。希望这对你有用!

公西姚石
2023-03-14

您忘记添加属性:@xmlacessortype(xmlacesstype.FIELD)

示例:@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)公共类Todo{…

汪正卿
2023-03-14

我自己搜索了很多回复,结果就是这样。除了TodoResource类之外,还需要一个扩展应用程序的类,以及下面的MOXyJsonContextResolver类等类来实现ContextResolver接口。这些帮助定义Jersey上下文以及选定的Json转换器和Json输出的可选自定义。将这些类与资源类放在同一个包中,Jersey就会找到它。MOXy现在是Jersey的默认值(我使用的是2.5.1),也是我唯一可以在不收到错误的情况下工作的json转换器。此外,确保您的构建或maven pom中包含MOXy jar。xml(jersey-media-moxy-2.5.1.jar)。

注意:我的应用程序的web中没有任何内容。xml。这在较旧的文档示例中,从Jersey 2.5.1起不再需要。

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

public ApplicationConfig() {
    this.initMethods();
}

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

private void initMethods() {
    try {
        ...some classes you might need instantiated, etc, for your resource class
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void addRestResourceClasses(Set<Class<?>> resources) {
    resources.add(MOXyJsonContextResolver.class);
}

}

这是MOXyJsonContextResolver。用于自定义Json响应的类:

public class MOXyJsonContextResolver implements ContextResolver<MoxyJsonConfig>  {
private final MoxyJsonConfig config;

public MOXyJsonContextResolver() {

    config = new MoxyJsonConfig()
            .setAttributePrefix("")
            .setValueWrapper("value")
            .property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
}

@Override
public MoxyJsonConfig getContext(Class<?> objectType) {
    return config;
}
}
 类似资料:
  • 问题内容: 我一直坚持使用jersey库为RESTful Web服务创建gradle项目。项目配置应该能够在码头应用服务器内启动服务。我已经找到了资源:https : //github.com/ziroby/jetty-gradle-hello- world 该解决方案的我的问题是,它使用的是球衣的过时版本。我至少需要版本2(最好是最新的2.14)。我试图在Maven Central上搜索新版本,

  • 我对web服务非常陌生。我已经公开了一些使用与Spring集成的Jersey 2的REST服务。现在我需要使用用户名/密码身份验证来保护那些rest服务。我被告知不要使用Spring Security。 我不知道该怎么做。我确实在网上搜索了一下,但是各种链接显示了不同的实现方式,我无法决定如何进行。

  • 当我尝试在任何一点使用定位器时,我仍然无法创建我使用locator.create(mything.class)方法在AbstractBinder中注册的东西的实例。 我确信它们是正确绑定的,因为它们通过@inject字段注释被正确地注入到我的资源类中。 不同的是,Jersey/HK2框架正在实例化我的资源类(正如预期的那样,因为它们在我的包扫描路径中),但我似乎无法通过代码来利用ServiceLo

  • 我正在使用Spring4.0为RESTfulWeb服务创建POC。如果我们只传递字符串或任何其他基本数据类型,它就可以正常工作。 这个很好用。但如果我想将字节流或文件对象传递给函数,我如何编写具有这些参数的函数?我如何编写提供传递字节流的客户端? 我尝试了这个代码,但是得到了415个错误。 客户端代码-使用apache HttpClient

  • 我试图在Jersey测试类中注入一个由HK2工厂服务提供的对象,但得到未满足的依赖项异常。 MultiException有3个异常。它们是: org.glassfish.hk2.api.unsatifiedDependencyException:在SystemInjecteeImpl(requiredtype=closeableService,parent=TestFactory,qualifie

  • 问题内容: 我使用Jersey 1.11做了一个小型Rest Web服务。当我调用返回Json的url时,非英文字符的字符编码存在问题。Xml的相应网址(“ test.xml”在开始的xml-tag中使其成为utf-8。 如何使网址“ test.json”返回utf-8编码的响应? 这是该服务的代码: 这是服务使用的pojo: 问题答案: Jersey在默认情况下应始终生成utf-8,听起来像是您