问题描述
我正在开发 RESTEasy 示例.在此示例中,我使用所有最新的依赖项并部署 om tomcat 8.x 版本.我可以成功部署应用程序,但是当我启动 url 时:http://localhost:8080/RESTfulExample/rest/restwebservice/list,我看到以下错误即将到来.请指导这里出了什么问题.
I am developing RESTEasy Example. In this example I am using all latest dependencies and deploying om tomcat 8.x version. I can successfully deploy the application but when I am launching the url: http://localhost:8080/RESTfulExample/rest/restwebservice/list, I see following errors are coming. Please guide what is going wrong here.
org.**oss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: java.util.ArrayList of media type: text/html at org.**oss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:66) at org.**oss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:466) at org.**oss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:415) at org.**oss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:202) at org.**oss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221) at org.**oss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) at org.**oss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
到目前为止我开发的代码供参考:pom.xml
The code I developed so far for reference: pom.xml
<repositories> <repository> <id>**oss repository</id> <url>https://repository.**oss.org/nexus/content/groups/public-**oss/</url> </repository> </repositories> <properties> <java.version>1.8</java.version> <resteasy-jaxrs-version>3.0.16.Final</resteasy-jaxrs-version> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>org.**oss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>${resteasy-jaxrs-version}</version> </dependency> <dependency> <groupId>org.**oss.resteasy</groupId> <artifactId>resteasy-servlet-initializer</artifactId> <version>${resteasy-jaxrs-version}</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <!-- Project Build --> <build> <finalName>RESTfulExample</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build>
学生.java
@XmlRootElement public class Student { private int student_id; private String student_name; private String student_rollnumber; // setters and getters }
RESTEasyService.java
RESTEasyService.java
@ApplicationPath("/rest") public class RESTEasyService extends Application{ }
RESTWebServiceJavaExample.java
RESTWebServiceJavaExample.java
@Path("/restwebservice") public class RESTWebServiceJavaExample { private TreeMap<Integer, Student> webserviceMap= new TreeMap<>(); public RESTWebServiceJavaExample(){ Student student = new Student(); student.setStudent_name("Ricky"); student.setStudent_rollnumber("AOHP451"); addStudent(student); student = new Student(); student.setStudent_name("Mayer"); student.setStudent_rollnumber("DKLP987"); addStudent(student); } @GET @Path("list") public List<Student> getStudents() { List<Student> students = new ArrayList<Student>(); students.addAll(webserviceMap.values()); return students; } @POST @Path("add") @Produces("text/plain") @Consumes("application/xml") public void addStudent(Student student_param) { int id = webserviceMap.size(); student_param.setStudent_id(id); webserviceMap.put(id, student_param); } }
web.xml:
<web-app id="WebApp_ID" version="2.4" xmlns="http://www.51sjk.com/Upload/Articles/1/0/337/337308_20221117112746929.jpg" xmlns:xsi="http://www.51sjk.com/Upload/Articles/1/0/337/337308_20221117112747147.jpg" xsi:schemaLocation="http://www.51sjk.com/Upload/Articles/1/0/337/337308_20221117112746929.jpg http://www.51sjk.com/Upload/Articles/1/0/337/337308_20221117112746929.jpg/web-app_2_4.xsd"> <display-name>Restful Web Application</display-name> </web-app>
推荐答案
现在我可以解决这个问题了.我需要在 pom.xml 中添加以下依赖项:
Now I am able to solve this issue. I need to add following dependency in pom.xml:
<dependency> <groupId>org.**oss.resteasy</groupId> <artifactId>resteasy-jaxb-provider</artifactId> <version>3.0.16.Final</version> </dependency>
并且 1) 我应该在方法签名上使用 @Produces(MediaType.APPLICATION_XML) 以获得以下响应.
And 1) I should be using @Produces(MediaType.APPLICATION_XML) on method signature to get following response.
<collection> <student> <student_id>0</student_id> <student_name>Ricky</student_name> <student_rollnumber>AOHP451</student_rollnumber> </student> <student> <student_id>1</student_id> <student_name>Mayer</student_name> <student_rollnumber>DKLP987</student_rollnumber> </student> </collection>
如果你想使用 @Produces(MediaType.TEXT_PLAIN) 那么代码会给你以下看起来没什么用的输出.
If you want to use @Produces(MediaType.TEXT_PLAIN) then code will gives you following output which doesn't looks useful.
[com.mkyong.rest.Student@4d5fd75e, com.mkyong.rest.Student@7715574d]
[com.mkyong.rest.Student@4d5fd75e, com.mkyong.rest.Student@7715574d]
所以使用 1) 解决方案.
So use 1) solution.