2017-08-08 1 views
0

hinzufügen, arbeite ich an einem Rest-API mit Jersey. Ich muss eine @PUT Methode hinzufügen, aber es löst eine Ausnahme aus.HTTP-Status 500 - Servlet.init() für Servlet Trikot-Servlet warf Ausnahme Wenn ich @PUT-Methode

Dies ist die Methode, die ich jetzt hinzufügen versuchen:

@Path("/login") 
public class LoginController { 
... 
    @PUT 
    @Path("/user") 
    @Consumes("application/json;charset=utf-8") 
    @Produces("application/json;charset=utf-8") 
    public String putUser(@QueryParam("user")LoginUser lu) { 
     return "login failed"; 
    } 
... 
} 

In Wirklichkeit mehr Inhalt in dem Verfahren gibt es aber den Inhalt spielt keine Rolle. Wenn diese Methode in der Klasse vorhanden ist, erhalte ich die folgende Ausnahme bei dem Versuch, auf den Server zuzugreifen:

javax.servlet.ServletException: Servlet.init() for servlet jersey-servlet threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:748) 
root cause 

com.sun.jersey.spi.inject.Errors$ErrorMessagesException 
    com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) 
    com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136) 
    com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:790) 
    com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:509) 
    com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:339) 
    com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605) 
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:207) 
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:394)`enter code here` 
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:577) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    java.lang.Thread.run(Thread.java:748) 

Es gibt auch andere @PUT Methoden in der Klasse, die, wie sie funktionieren sollen, aber wenn ich diese neuen hinzufügen, alles hört auf zu arbeiten.

Dies ist der Inhalt meiner Datei web.xml:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>REST API</display-name> 

    <servlet> 
    <servlet-name>jersey-servlet</servlet-name> 
    <servlet-class> 
     com.sun.jersey.spi.container.servlet.ServletContainer 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>jersey-servlet</servlet-name> 
    <url-pattern>/ws/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

Wenn ich die @PUT Annotation @GET und entfernen Sie die @Consumes Anmerkung zu ändern, alles funktioniert. Warum kann ich keinen neuen @PUT hinzufügen?

+0

Was passiert, wenn Sie nur die Annotation @ Consumes entfernen? Funktioniert es? – Nathan

+1

Wenn Sie den LoginUser im body (json) senden, müssen Sie @QueryParam ("user") entfernen –

+0

@Nathan Nein, es sei denn, ich ändere auch PUT in GET. –

Antwort

0

Beachten Sie, dass Sie die LoginUser als JSON-Anforderung senden, so dass Sie @QueryParam("user") entfernen müssen.

Verwandte Themen