java 尝试使用 Jersey 制作 Restful WebService 时出错
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16240637/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Errors while trying to make a Restful WebService with Jersey
提问by
I am following thistutorial to create a CRUD RESTful WebService.
我正在按照本教程创建一个 CRUD RESTful WebService。
The tutorial for this type of WebService starts in paragraph 7. I create the Server and the Client.
这种类型的 WebService 的教程从第 7 段开始。我创建了服务器和客户端。
The Server seems to work perfectly fine as i do what the author suggests to test it and everything works as expected.
服务器似乎工作得很好,因为我按照作者的建议进行了测试,一切都按预期工作。
However, the Client gives me a hard time. When i run it i always get this error:
然而,客户让我很难受。当我运行它时,我总是收到此错误:
201
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><todoes><todo><id>3</id><summary>Blabla</summary></todo><todo><description>Read complete http://www.vogella.com</description><id>2</id><summary>Do something</summary></todo><todo><description>Read http://www.vogella.com/articles/REST/article.html</description><id>1</id><summary>Learn REST</summary></todo></todoes>
Exception in thread "main" com.sun.jersey.api.client.UniformInterfaceException: GET http://localhost:8080/CRUDserver/rest/todos returned a response status of 500 Internal Server Error
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:686)
at com.sun.jersey.api.client.WebResource.access0(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:507)
at es.unican.cityInfo.client.Tester.main(Tester.java:34)
What exactly is the problem i cant understand ? Any ideas ?
我无法理解的问题究竟是什么?有任何想法吗 ?
The only assumption i can make , is based in this phrase of the author , in the beginning of building the client :
我可以做出的唯一假设是基于作者在构建客户端开始时的这句话:
Create a new Java project called de.vogella.jersey.todo.client. Create a lib folder and place all jersey libs in this folder. Add the jars to the classpath of the project.
Create a new Java project called de.vogella.jersey.todo.client. Create a lib folder and place all jersey libs in this folder. Add the jars to the classpath of the project.
He says to place all jersey libs
inside a folder. However what are these libs???
The only thing i have for the client are 2 jar files : jersey-client.jar
and jersey-core.jar
which i found on the site of jersey...
他说把所有东西都jersey libs
放在一个文件夹里。但是这些库是什么???我有一个客户端的唯一的事情是2个jar文件:jersey-client.jar
和jersey-core.jar
我发现球衣的网站上...
As suggested here is the log from the server , when i run the client :
正如这里所建议的,当我运行客户端时,来自服务器的日志:
Apr 26, 2013 5:46:19 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<es.unican.cityInfo.model.Todo>, and MIME media type application/json was not found
Apr 26, 2013 5:46:19 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: The registered message body writers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
Apr 26, 2013 5:46:19 PM com.sun.jersey.spi.container.ContainerResponse logException
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<es.unican.cityInfo.model.Todo>, and MIME media type application/json was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<es.unican.cityInfo.model.Todo>, and MIME media type application/json was not found
... 24 more
采纳答案by thatidiotguy
Since you are getting a 500 error, this means the code is erroring on the server side. You will have to look at the log on the server side to figure out what went wrong.
由于您收到 500 错误,这意味着代码在服务器端出错。您必须查看服务器端的日志才能找出问题所在。
HTTP Status Codes are meant to give you information about the request.
HTTP 状态代码旨在为您提供有关请求的信息。
See here
看这里
EDIT:
编辑:
So it appears that your return type on the method being mapped to that HTTP request is JSON, but you have not registered a JSON message writer for Jersey to use.
因此,您映射到该 HTTP 请求的方法的返回类型似乎是 JSON,但您尚未为 Jersey 注册 JSON 消息编写器以供使用。
回答by Federico Raggi
Probably the simples way is to use Jersey's POJO support feature. To enable it, add the JSONConfiguration.FEATURE_POJO_MAPPING init parameter to the servlet configuration of your web.xml:
可能最简单的方法是使用 Jersey 的 POJO 支持功能。要启用它,请将 JSONConfiguration.FEATURE_POJO_MAPPING init 参数添加到 web.xml 的 servlet 配置中:
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
...
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
...
<load-on-startup>1</load-on-startup>
</servlet>
You will probably need to add a couple of jar's in addition to the ones you already have. Check this link for a list of the dependencies: https://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1828
除了已有的 jar 之外,您可能还需要添加几个 jar。检查此链接以获取依赖项列表:https: //jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1828
回答by rjdkolb
Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List, and MIME media type application/json was not found
引起:com.sun.jersey.api.MessageException:未找到 Java 类 java.util.ArrayList 和 Java 类型 java.util.List 和 MIME 媒体类型应用程序/json 的消息正文编写器
I think your es.unican.cityInfo.model.Todo class is missing the following annotation @XmlRootElement
我认为您的 es.unican.cityInfo.model.Todo 类缺少以下注释 @XmlRootElement
i.e.
IE
package de.vogella.jersey.jaxb.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement // never forget me
// JAX-RS supports an automatic mapping from JAXB annotated class to XML and JSON
// Isn't that cool?
public class 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;
}
}