[英]Jersey Restful Web Service - MessageBodyProviderNotFoundException
我是Java Web Services的新手,我正在努力解決一個基本問題。
在找到一堆過時的例子之后,我設法得到了一些使用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接口。 這些有助於定義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;
}
}
您忘了添加屬性: @XmlAccessorType(XmlAccessType.FIELD)
示例: @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Todo { ...
你在todo類的類級別提到了@XmlRootElement
。 @XmlRootElement
如果要產生你的回應時,才需要xml
格式,同時還提供@Path
在方法層面TodoResource
類,它是一個很好的做法。 在方法級別提及@Produces(MediaType.APPLICATION_JSON)
。 希望這對你有用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.