Jersey ServletContext属性在实现中通过restful web服务访问时为null

Jersey ServletContext属性在实现中通过restful web服务访问时为null,jersey,jax-rs,Jersey,Jax Rs,我有一个带有单个控制器的Java MVC应用程序。数据库在servlet上下文侦听器类中初始化。我将数据库对象作为servlet上下文属性传递给控制器servlet和webservice类。在controllerservlet中,“db”属性工作正常,但在web服务类中,我得到了null和非法状态异常 错误堆栈跟踪- javax.servlet.ServletException: A MultiException has 2 exceptions. They are: 1. java.lan

我有一个带有单个控制器的Java MVC应用程序。数据库在servlet上下文侦听器类中初始化。我将数据库对象作为servlet上下文属性传递给控制器servlet和webservice类。在controllerservlet中,“db”属性工作正常,但在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)
javax.servlet.ServletException:多重异常有2个异常。他们
是:
1.java.lang.NullPointerException
2.java.lang.IllegalStateException:无法执行操作:在上创建
com.home.mystorywriter.UserWS
org.glassfish.jersey.servlet.WebComponent.serviceinpl(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)
根本原因
java.lang.NullPointerException
在com.home.mystorywriter.UserWS.(UserWS.java:36)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
Web服务类

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;
 }

 }
package com.home.mystorywriter;
导入java.util.ArrayList;
导入java.util.List;
导入javax.servlet.ServletContext;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.products;
导入javax.ws.rs.core.Context;
导入javax.ws.rs.core.MediaType;
导入com.google.gson.gson;
@路径(“/users”)
公共类用户{
@上下文
私有HttpServletRequest请求;
私有HttpServletRes;
私有服务上下文;
DAOdb db=(DAOdb)req.getServletContext().getAttribute(“db”);
@得到
@产生(MediaType.APPLICATION_JSON)
@路径(“诱惑者”)
公共字符串getAllUsers(){
List userlist=db.getProfileListOfAllUsers();
Gson Gson=新的Gson();
字符串jsonUsers=gson.toJson(userlist);
返回jsonuser;
}
}
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>

MyServletContextListener
com.home.mystorywriter.MyServletContextListener
StoryServlet
com.home.mystorywriter.StoryServlet
泽西岛休息服务
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.home.mystorywriter
com.sun.jersey.api.json.POJOMappingFeature
真的
StoryServlet
/StoryServlet
泽西岛休息服务
/休息/*
login.html

@上下文注入发生在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;
}
} 

@上下文注入发生在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;
}
} 

你认错问题了。属性不是空的。它是
req
,此时为空。您基本上是在注入之前尝试访问它。感谢您在正确的上下文中提供指导!是的,注入发生在资源级别。下面的代码工作正常。您错误地识别了问题。属性不是空的。它是
req
,此时为空。您基本上是在注入之前尝试访问它。感谢您在正确的上下文中提供指导!是的,注入发生在资源级别。下面的代码工作正常。