2016-05-24 2 views
1

私は単一のコントローラを持つJava MVCアプリケーションを持っています。データベースは、サーブレット・コンテキスト・リスナー・クラスで初期化されます。私は、コントローラサーブレットとWebサービスクラスにサーブレットコンテキスト属性としてデータベースオブジェクトを渡しています。コントローラサーブレットでは、 "db"属性は正常に動作していますが、Webサービスクラスではnullと不正な状態の例外が発生しています。ServletContext属性は、ジャージインプリメンテーションの安らかなWebサービスを介してアクセスする場合はnullです。

エラースタックトレース -

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クラス

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

問題を誤って確認しました。ヌル属性ではありません。その時点では 'req'はnullです。あなたは基本的にそれが注入される前にそれにアクセスしようとしています。 – BalusC

+0

正しい状況でご案内いただきありがとうございます!はい、注入はリソースレベルで行われます。以下のコードは正常に動作しています。 – bodhi

答えて

0

@Contextインジェクションは、Webサービスクラスやクラスメソッドの内部で起こります。以下のコードは正常に動作しています。

@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; 
} 
} 
関連する問題