Ich habe eine Java MVC-Anwendung mit einem einzigen Controller. Die Datenbank wird in der Servletkontext-Listener-Klasse initialisiert. Ich übergebe das Datenbankobjekt als Servlet-Context-Attribut an das Controller-Servlet und die Webservice-Klasse. Im Controller-Servlet funktioniert das "db" -Attribut gut, aber in der Web-Service-Klasse erhalte ich eine ungültige und ungültige Status-Ausnahme.ServletContext-Attribut ist null, wenn auf es über erholsame Web-Service in Jersey-Implementierung zugreifen
Fehler Stacktrace -
javax.servlet.ServletException: A MultiException has 2 exceptions. They
are:
1. java.lang.NullPointerException
2. java.lang.IllegalStateException: Unable to perform operation: create on
com.home.mystorywriter.UserWS
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java: 388)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java: 341)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java: 228)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.NullPointerException
at com.home.mystorywriter.UserWS.<init>(UserWS.java:36)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
WebService-Klasse
package com.home.mystorywriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import com.google.gson.Gson;
@Path("/users")
public class UserWS {
@Context
private HttpServletRequest req;
private HttpServletResponse res;
private ServletContext context ;
DAOdb db = (DAOdb)req.getServletContext().getAttribute("db");
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("allUsers")
public String getAllUsers() {
List<Profile> userlist = db.getProfileListOfAllUsers();
Gson gson = new Gson();
String jsonUsers = gson.toJson(userlist);
return jsonUsers;
}
}
Web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
si:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<listener>
<description>MyServletContextListener</description>
<listener-
class>com.home.mystorywriter.MyServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>StoryServlet</servlet-name>
<servlet-class>com.home.mystorywriter.StoryServlet</servlet-class>
</servlet>
<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>com.home.mystorywriter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>StoryServlet</servlet-name>
<url-pattern>/StoryServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
</web-app>
Sie haben das Problem falsch identifiziert. Es ist nicht das Attribut, das null ist. Es ist 'req', das an diesem Punkt null ist. Du versuchst grundsätzlich, darauf zuzugreifen, bevor es injiziert wird. – BalusC
Vielen Dank für die Führung im richtigen Kontext! Ja, die Injektion erfolgt auf Ressourcenebene. Der folgende Code funktioniert einwandfrei. – bodhi