Ejb注入空指针
Ejb injection null pointer
我在 RAD 中有一个用于我的项目的 websphere 应用程序服务器,我正在尝试使用 ejb.Here 注入对象是我的文件
LoginServlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@EJB UserService userService;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String username=request.getParameter("username");
String password=request.getParameter("password");
String a = userService.authorize(username, password);
if(username.equals("qwe"))
{
RequestDispatcher rd=request.getRequestDispatcher("servlet2");
rd.forward(request, response);
}
else
{
out.print("Sorry UserName or Password Error!");
RequestDispatcher rd=request.getRequestDispatcher("/index.html");
rd.include(request, response);
}
}
}
UserService(也尝试使用 @ejb 而不是 @Inject 作为 dao)
@Stateless
@Interceptors(ApplicationEntityManagerInterceptor.class)
public class UserService{
@Inject
protected UserDAO userDAO;
public String authorize(String username,String password)
{
return this.userDAO.authenticate(username, password);
}
}
UserDAO
@Stateless
@Interceptors(ApplicationEntityManagerInterceptor.class)
public class UserDAO extends GenericDAOJpaImpl<User, String>
{
public String authenticate(String username,String password)
{
Map<String, Object> params = new HashMap<String, Object>();
params.put("username", username);
params.put("password", password);
User user= findSingleByNamedQueryAndNamedParams(User.AUTHENTICATE, params);
return "TRUE";
}
}
拦截器
public class ApplicationEntityManagerInterceptor
{
@AroundInvoke
public Object joinTransaction(InvocationContext context) throws Exception
{
Object emAux = context.getParameters()[0];
if(emAux instanceof EntityManager){
EntityManager em = (EntityManager) emAux;
em.joinTransaction();
}
return context.proceed();
}
}
里面 web.xml
<ejb-local-ref>
<ejb-ref-name>gr.mess.web.servlets.LoginServlet/userService</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>gr.mess.services.UserService</local>
<injection-target>
<injection-target-class>gr.mess.web.servlets.LoginServlet</injection-target-class>
<injection-target-name>userService</injection-target-name>
</injection-target>
</ejb-local-ref>
我的问题是 userService 是正常创建的,但服务中的 DAO 对象是 null.What 我应该 do.I 根据另一个项目创建它,但该项目正常工作但我没有得到 it.In DAO 的另一个项目不是任何 xml 任何类型的配置
更新 GenericDAOJpaImpl
@无状态
@拦截器(ApplicationEntityManagerInterceptor.class)
public class GenericDAOJpaImpl
{
protected Class<T> entityClass;
@PersistenceContext(unitName = "TEST_SQL")
protected EntityManager em;
public GenericDAOJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass
.getActualTypeArguments()[0];
}
public T create(T t) ..
public T load(PK id) ..
public T update(T t)..
public void delete(T t) ..
public T save(T t) ..
public Class<T> getEntityClass()..
public Query createNamedQuery(String name)..
@SuppressWarnings("unchecked")..
public List<T> findByNamedQuery(final String name, Object... params)..
public T findSingleByNamedQuery(final String name, Object... params)..
public List<T> findByNamedQueryAndNamedParams(final String name, final Map<String, ? extends Object> params)..
..
更新 2:
我通过执行以下操作解决了我的问题
这次在耳朵上创建一个 META-INF 文件夹并添加三个名为 application.xml beans.xml 和 ibm-application-bnd.xml 的 xml 文件,并在 userDAO 上方添加 @Inject 注释
您正在使用 CDI 注入。
- 您在这里使用的 CDI
/JEE
/WebSphere
是什么版本?
- 你在 jar 的 META-INF
中有一个 beans.xml
文件还是隐式 CDI 扫描(取决于 WAS/CDI 版本和设置)?
- "UserDAO"
是否符合 CDI bean 的条件(即 GenericDAOJpaImpl
class 是什么?
您可以在 UserDAO
中用 @PostConctruct
注释的方法中添加一些跟踪信息,以查看它是否由 CDI 容器创建
通常,如果 WebSphere 知道 EJB 中指定的注入,并且无法满足该注入,则不会创建 EJB 本身。因为听起来像是正在创建 EJB,所以 WebSphere 不知道 UserDAO 注入。我会寻找以下内容:
- web.xml 版本 >= 2.5(旧版本忽略注释)
- ejb-jar.xml 版本 >= 3.0(在旧版本中忽略注释)
- metadata-complete="false" 或未设置(true 将忽略注释)
- metadata-complete 在安装期间设置为 "true"(安装选项)
我通过执行以下操作解决了我的问题这次在耳朵上创建了一个 META-INF 文件夹并添加了三个名为 application.xml beans.xml 和 ibm-application-[的 xml 文件=14=] 并在 userDAO
上方添加 @Inject 注释
我在 RAD 中有一个用于我的项目的 websphere 应用程序服务器,我正在尝试使用 ejb.Here 注入对象是我的文件
LoginServlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@EJB UserService userService;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String username=request.getParameter("username");
String password=request.getParameter("password");
String a = userService.authorize(username, password);
if(username.equals("qwe"))
{
RequestDispatcher rd=request.getRequestDispatcher("servlet2");
rd.forward(request, response);
}
else
{
out.print("Sorry UserName or Password Error!");
RequestDispatcher rd=request.getRequestDispatcher("/index.html");
rd.include(request, response);
}
}
}
UserService(也尝试使用 @ejb 而不是 @Inject 作为 dao)
@Stateless
@Interceptors(ApplicationEntityManagerInterceptor.class)
public class UserService{
@Inject
protected UserDAO userDAO;
public String authorize(String username,String password)
{
return this.userDAO.authenticate(username, password);
}
}
UserDAO
@Stateless
@Interceptors(ApplicationEntityManagerInterceptor.class)
public class UserDAO extends GenericDAOJpaImpl<User, String>
{
public String authenticate(String username,String password)
{
Map<String, Object> params = new HashMap<String, Object>();
params.put("username", username);
params.put("password", password);
User user= findSingleByNamedQueryAndNamedParams(User.AUTHENTICATE, params);
return "TRUE";
}
}
拦截器
public class ApplicationEntityManagerInterceptor
{
@AroundInvoke
public Object joinTransaction(InvocationContext context) throws Exception
{
Object emAux = context.getParameters()[0];
if(emAux instanceof EntityManager){
EntityManager em = (EntityManager) emAux;
em.joinTransaction();
}
return context.proceed();
}
}
里面 web.xml
<ejb-local-ref>
<ejb-ref-name>gr.mess.web.servlets.LoginServlet/userService</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>gr.mess.services.UserService</local>
<injection-target>
<injection-target-class>gr.mess.web.servlets.LoginServlet</injection-target-class>
<injection-target-name>userService</injection-target-name>
</injection-target>
</ejb-local-ref>
我的问题是 userService 是正常创建的,但服务中的 DAO 对象是 null.What 我应该 do.I 根据另一个项目创建它,但该项目正常工作但我没有得到 it.In DAO 的另一个项目不是任何 xml 任何类型的配置
更新 GenericDAOJpaImpl @无状态 @拦截器(ApplicationEntityManagerInterceptor.class) public class GenericDAOJpaImpl {
protected Class<T> entityClass;
@PersistenceContext(unitName = "TEST_SQL")
protected EntityManager em;
public GenericDAOJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass
.getActualTypeArguments()[0];
}
public T create(T t) ..
public T load(PK id) ..
public T update(T t)..
public void delete(T t) ..
public T save(T t) ..
public Class<T> getEntityClass()..
public Query createNamedQuery(String name)..
@SuppressWarnings("unchecked")..
public List<T> findByNamedQuery(final String name, Object... params)..
public T findSingleByNamedQuery(final String name, Object... params)..
public List<T> findByNamedQueryAndNamedParams(final String name, final Map<String, ? extends Object> params)..
..
更新 2: 我通过执行以下操作解决了我的问题 这次在耳朵上创建一个 META-INF 文件夹并添加三个名为 application.xml beans.xml 和 ibm-application-bnd.xml 的 xml 文件,并在 userDAO 上方添加 @Inject 注释
您正在使用 CDI 注入。
- 您在这里使用的 CDI
/JEE
/WebSphere
是什么版本?
- 你在 jar 的 META-INF
中有一个 beans.xml
文件还是隐式 CDI 扫描(取决于 WAS/CDI 版本和设置)?
- "UserDAO"
是否符合 CDI bean 的条件(即 GenericDAOJpaImpl
class 是什么?
您可以在 UserDAO
中用 @PostConctruct
注释的方法中添加一些跟踪信息,以查看它是否由 CDI 容器创建
通常,如果 WebSphere 知道 EJB 中指定的注入,并且无法满足该注入,则不会创建 EJB 本身。因为听起来像是正在创建 EJB,所以 WebSphere 不知道 UserDAO 注入。我会寻找以下内容:
- web.xml 版本 >= 2.5(旧版本忽略注释)
- ejb-jar.xml 版本 >= 3.0(在旧版本中忽略注释)
- metadata-complete="false" 或未设置(true 将忽略注释)
- metadata-complete 在安装期间设置为 "true"(安装选项)
我通过执行以下操作解决了我的问题这次在耳朵上创建了一个 META-INF 文件夹并添加了三个名为 application.xml beans.xml 和 ibm-application-[的 xml 文件=14=] 并在 userDAO
上方添加 @Inject 注释