Jaxb Jersey Restful Web服务-MessageBodyProviderNotFoundException
我是JavaWeb服务的新手,我正在努力解决一个基本问题 在找到了一堆过时的示例之后,我设法找到了一些可以使用XML的东西,但是当我要求它返回JSON时,相同的代码就不起作用了 起初我认为它缺少一个JSON格式化程序,但JAXB应该负责从POJO到JSON的转换,所以我认为这不是问题所在 Tomcat中引发的错误是:Jaxb Jersey Restful Web服务-MessageBodyProviderNotFoundException,jaxb,jersey,Jaxb,Jersey,我是JavaWeb服务的新手,我正在努力解决一个基本问题 在找到了一堆过时的示例之后,我设法找到了一些可以使用XML的东西,但是当我要求它返回JSON时,相同的代码就不起作用了 起初我认为它缺少一个JSON格式化程序,但JAXB应该负责从POJO到JSON的转换,所以我认为这不是问题所在 Tomcat中引发的错误是: javax.servlet.ServletException: org.glassfish.jersey.message.internal.MessageBodyProviderN
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>
TodoResource.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;
}
}
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类之外,还需要一个扩展应用程序的类,以及下面的MOXyJsonContextResolver类来实现ContextResolver接口。这些帮助定义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);
}
}
@javax.ws.rs.ApplicationPath(“webresources”)
公共类应用程序配置扩展应用程序{
公共应用程序配置(){
this.initMethods();
}
@凌驾
public Set>resources=new java.util.HashSet您忘记添加属性:@xmlacessortype(xmlacesstype.FIELD)
例如:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共课待办事项{
…
您在todo类中提到了类级别的@XmlRootElement
。@XmlRootElement
仅当您希望以xml
格式生成响应,并且在TodoResource
类中的方法级别提供@Path
时才是必需的,这是一个很好的实践。
在方法级别提到@products(MediaType.APPLICATION\u JSON)
。希望这对您有用!。例如,您可以尝试使用MOXy,只需将库添加到类路径中,就可以了。
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;
}
}