Ejb注入空指针

时间:2018-04-27 12:28:48

标签: java xml ejb websphere code-injection

我在RAD的项目中有一个websphere应用服务器,我很想用ejb注入对象。这是我的文件

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 for the 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。我应该怎么做。我是根据另一个项目创建的,但是该项目正常工作,我没有得到它。在另一个项目中对于任何类型的配置,DAO都不是任何xml

更新GenericDAOJpaImpl     @Stateless     @Interceptors(ApplicationEntityManagerInterceptor.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 annontation

3 个答案:

答案 0 :(得分:0)

您在这里使用CDI注射 - 您在这里使用的CDI / JEE / WebSphere是什么版本? - 您是否在jar的beans.xml中有META-INF个文件或CDI扫描是否存在(取决于WAS / CDI版本和设置)?
- "UserDAO"是否有资格作为CDI bean(即什么是GenericDAOJpaImpl类?

您可以在@PostConctruct中使用UserDAO注释的方法中添加一些跟踪信息,以查看它是否由CDI容器创建

答案 1 :(得分:0)

通常,如果WebSphere知道EJB中指定的注入,并且无法满足注入,那么将不会创建EJB本身。由于它听起来像是在创建EJB,因此WebSphere不知道UserDAO注入。我会寻找以下内容:

  • web.xml版本&gt; = 2.5(旧版本中忽略注释)
  • ejb-jar.xml版本&gt; = 3.0(旧版本中忽略注释)
  • 元数据的完整=&#34;假&#34;或不设置(true将忽略注释)
  • metadata-coplete设置为&#34; true&#34;安装期间(安装选项)

答案 2 :(得分:0)

我通过执行以下操作修复了我的问题,这次在耳朵上创建了一个META-INF文件夹,并添加了三个名为application.xml beans.xml和ibm-application-bnd.xml的xml文件,并在上面添加了@Inject annontation userDAO的