Ejb-инъекция нулевой указатель - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть сервер приложений websphere для моего проекта в RAD, и я собираюсь добавить объекты с помощью 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 для дао)

@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» на ухо и добавляем три xml-файла с именами application.xml beans.xml и ibm-application-bnd.xml и добавляем аннотацию @Inject над userDAO

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Как правило, если WebSphere знает о внедрении, указанном в EJB, и это внедрение не может быть выполнено, то сам EJB не будет создан. Поскольку создается впечатление, что создается EJB, WebSphere не знает о внедрении UserDAO. Я бы искал следующее:

  • web.xml версия> = 2.5 (аннотации игнорируются в старых версиях)
  • ejb-jar.xml version> = 3.0 (аннотации игнорируются в более старых версиях)
  • metadata-complete = "false" или не задано (true игнорирует аннотации)
  • metadata-coplete, установленный в "true" во время установки (опция установки)
0 голосов
/ 02 мая 2018

Я исправил свою проблему, выполнив следующие действия, создав на этот раз папку META-INF на ухо, добавив три XML-файла с именем application.xml beans.xml и ibm-application-bnd.xml и добавив аннотацию @Inject над userDAO

0 голосов
/ 28 апреля 2018

Вы используете инъекцию CDI здесь.
- какую версию CDI / JEE / WebSphere вы используете здесь?
- У вас есть файл beans.xml в META-INF банки или это влияет на сканирование CDI (зависит от версии и настройки WAS / CDI)?
- Квалифицируется ли "UserDAO" как бин CDI (то есть, что такое класс GenericDAOJpaImpl?

Вы можете добавить некоторую информацию о трассировке в метод, помеченный @PostConctruct в UserDAO, чтобы увидеть, создан ли он контейнером CDI

...