2016-05-24 12 views
1

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> 
+0

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

+0

Vielen Dank für die Führung im richtigen Kontext! Ja, die Injektion erfolgt auf Ressourcenebene. Der folgende Code funktioniert einwandfrei. – bodhi

Antwort

0

@Context Injektion innerhalb der Methode Web-Service-Klasse oder der Klasse geschieht. Der folgende Code funktioniert einwandfrei.

@Path("/users") 

public class UserWS { 
private ServletContext context ; 
DAOdb db; 
public UserWS() { 
System.out.println("Inside Constructor " + context); 
} 
@Context 
public void setServletContext(ServletContext context) { 
System.out.println("servlet context set here"); 
this.context = context; 
db = (DAOdb)context.getAttribute("db"); 
} 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/allUsers") 
public String getAllUsers() { 
System.out.println("Inside get method:"+ context); 
System.out.println("db value"+ db); 
Profile userlist = db.getProfileWithoutPic(); 
Gson gson = new Gson(); 
String jsonUsers = gson.toJson(userlist); 
return jsonUsers; 
} 
}