2015-05-12 2 views
5

Ich baue eine REST API mit Jax-rs 2. Ich erhalte immer eine Ausnahme, wenn ich versuche, den REST-Dienst auszuführen. Ich renne, um nach asyncResponse zu suchen. Ich bin mir nicht sicher, was ich mit der asyncResponse falsch mache. Wie ohne es, der Code läuft gut.REST async Operation wirft ProcessingException

Auch der Web-Container ist Tomcat 7.

hier wird der Stack-Trace Ausnahme:

WARNING: Attempt to put servlet request into asynchronous mode has failed. Please check your servlet configuration - all Servlet instances and Servlet filters involved in the request processing must explicitly declare support for asynchronous request processing. 
java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations. 
    at org.apache.catalina.connector.Request.startAsync(Request.java:1666) 
    at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1029) 
    at org.glassfish.jersey.servlet.async.AsyncContextDelegateProviderImpl$ExtensionImpl.suspend(AsyncContextDelegateProviderImpl.java:92) 
    at org.glassfish.jersey.servlet.internal.ResponseWriter.suspend(ResponseWriter.java:121) 
    at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.suspend(ServerRuntime.java:863) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:327) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:305) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:401) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 
    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) 

May 12, 2015 7:14:28 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Jersey REST Service] in context with path [/com.vogella.jersey.first] threw exception [javax.ws.rs.ProcessingException: Attempt to suspend a connection of an asynchronous request failed in the underlying container.] with root cause 
javax.ws.rs.ProcessingException: Attempt to suspend a connection of an asynchronous request failed in the underlying container. 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:328) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:305) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:401) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 
    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) 





May 12, 2015 7:14:28 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Jersey REST Service] in context with path [/com.vogella.jersey.first] threw exception [javax.ws.rs.ProcessingException: Attempt to suspend a connection of an asynchronous request failed in the underlying container.] with root cause 
javax.ws.rs.ProcessingException: Attempt to suspend a connection of an asynchronous request failed in the underlying container. 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:328) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:305) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:401) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 

Auch hier ist der 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" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 
    <display-name>com.vogella.jersey.first</display-name> 

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <!-- Register resources and providers under com.vogella.jersey.first package. 
    com.vogella.jersey.first contains the package where you see a REST mapping --> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.vogella.jersey.first</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 

    </servlet-mapping> 
</web-app> 

und dies wäre der Service:

package com.vogella.jersey.first; 

import javax.servlet.annotation.WebFilter; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.container.AsyncResponse; 
import javax.ws.rs.container.Suspended; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

// Plain old Java Object it does not extend as class or implements 
// an interface 

// The class registers its methods for the HTTP GET request using the @GET annotation. 
// Using the @Produces annotation, it defines that it can deliver several MIME types, 
// text, XML and HTML. 

// The browser requests per default the HTML MIME type. 

//Sets the path to base URL + /hello 
@Path("/hello") 
public class Hello { 

    // This method is called if TEXT_PLAIN is request 
    /*@GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String sayPlainTextHello() { 


    return "Hello Jersey"; 
    }*/ 

    @GET 
     @Produces(MediaType.TEXT_PLAIN) 
     public String sayPlainTextHello() { 

       return "Hello Jersey"; 
     } 

    // This method is called if XML is request 
    @GET 
    @Produces(MediaType.TEXT_XML) 
    public String sayXMLHello() { 

    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>"; 
    } 

    // This method is called if HTML is request 
    @GET 
    @Produces(MediaType.TEXT_HTML) 
    public String sayHtmlHello(@Suspended final AsyncResponse response) 
{ 

     Thread t = new Thread() 
     { 
     @Override 
     public void run() 
     { 
      try 
      { 
       Response jaxrs = Response.ok("basic").type(MediaType.TEXT_HTML).build(); 
       response.resume(jaxrs); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     }; 
     t.start(); 


    return "<html> " + "<title>" + "Hello Jersey" + "</title>" 
     + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; 
    } 

} 

Dies ist der Screenshot der lib-Dateien:

The jar files in the library

+0

Ich fügte die true in das Servlet-Mapp und die Anwendung funktioniert. !! –

+0

Setzen Sie es als Antwort. –

Antwort

5

Ich habe von der Asynchron-unterstützten Tag in der 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" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 
    <!-- the app version should be 3.0 or the application does not work --> 
    <display-name>RESTJerseyExample</display-name> 

     <servlet> 
     <servlet-name>RESTJerseyExample</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.crudapp</param-value> 
    </init-param> 
     <load-on-startup>1</load-on-startup> 
     <async-supported>true</async-supported> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>RESTJerseyExample</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 


</web-app> 
+0

arbeitete für mich, danke! – svarog

+0

Ich habe Version 2.5 verwendet und als ich die Version geändert habe, funktioniert es, danke – ganchito55

0

Tomcat Abhängigkeit

http://tomcat.apache.org/whichversion.html

Also stellen Sie zuerst sicher, dass Sie mindestens Tomcat 7 verwenden Wenn Sie Ihren Kater mit mvn starten sollten Sie

mvn tomcat7:run 

Stellen Sie sicher,

INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 

Tomcat Protokoll

das NIO-Protokoll für Ihren Anschluss

eingestellt siehe die folgende Zeile verwenden

Wenn Sie mvn verwenden

<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat7-maven-plugin</artifactId> 
    <configuration> 
    <protocol>org.apache.coyote.http11.Http11NioProtocol</protocol> 
    </configuration> 
</plugin> 

sonst in Ihrem server.xml

<Connector port="8080" 
protocol="org.apache.coyote.http11.Http11NioProtocol" 
... 
/> 

Sie so etwas in Ihrer tomcat logs

INFO: Starting ProtocolHandler ["http-nio-8080"] 

Jar Abhängigkeiten

Überprüfen Sie haben keine Abhängigkeit von Servlet sehen sollte 2.5

mit mvn

mvn dependency:tree 

Beachten Sie, dass Sie auch jsp-api v2.2

Web verwenden sollten.xml

Ändern Sie Ihre web.xml verwenden Version 3.0, https://docs.oracle.com/cd/E24329_01/web.1211/e21049/web_xml.htm#WBAPP503

<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_3_0.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0"> 

Fügen Sie den

<async-supported>true</async-supported> 

innen alle <servlet></servlet> und <filter></filter> (keine Notwendigkeit, innerhalb init-param sein)

Verwandte Themen