gpt4 book ai didi

jaxb - Jersey Restful Web 服务 - MessageBodyProviderNotFoundException

转载 作者:行者123 更新时间:2023-12-03 21:39:47 24 4
gpt4 key购买 nike

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

在找到一堆过时的示例后,我设法得到了一些使用 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

WEB.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 并抛出错误的任何想法?

最佳答案

我自己搜索了很多回复,这就是我最终要做的。除了您的 TodoResource 类之外,您还需要一个扩展 Application 的类,以及下面的 MOXyJsonContextResolver 类等类来实现 ContextResolver 接口(interface)。这些有助于定义 Jersey 上下文以及选定的 Json 转换器和对 Json 输出的可选自定义。将这些类与资源类放在同一个包中,Jersey 会找到它。 MOXy 现在是 Jersey 的默认设置(我使用 2.5.1),并且是唯一一个我可以在没有收到您的错误的情况下工作的 json 转换器。此外,请确保您的构建或 maven pom.xml (jersey-media-moxy-2.5.1.jar) 中包含 MOXy 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);
}

}

这是我用来自定义 Json 响应的 MOXyJsonContextResolver.class:
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;
}
}

关于jaxb - Jersey Restful Web 服务 - MessageBodyProviderNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20391894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com