EJB не инициализируется в Wildfly 9.0.0 с использованием @EJB - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь перейти с EJB2.x на EJB3.x, и я использую Wildfly 9.0.0.Старый EJB2.x работает в JBoss 4.2.2, и он выглядит следующим образом:

public interface WUFFacadeRemote extends EJBObject {
    public ClientData getItems(ClientData data);
    public ClientData save(ClientData data);
}

public interface WUFFacadeHome extends EJBHome {
    public WUFFacadeRemote create();
}

public class WUFFacade {
    public ClientData getItems(ClientData data) { 
        //code here
    }

    public ClientData save(ClientData data) {
        //code here
    }
}

public class WUFAction extends HttpServlet implements IAction {
    public void doPost(HttpServletRequest request, HttpServletResponse response) {

        ... 

        Object objRef = ic.lookup("java:comp/env/wUF");

        com.wuf.WUFFacadeHome home = (com.wuf.WUFFacadeHome) PortableRemoteObject.narrow(objRef, com.wuf.WUFFacadeHome.class);

        engine = home.create();

        //engine gets the reference, and I can use it normally.
        ...
    }
}

У меня также есть ejb-jar.xml, и он работает.Итак, решение, которое я думал для EJB3.x и Wildfly 9.0.0, выглядит следующим образом:

@WebServlet(urlPatterns = "windows/wUF.do", loadOnStartup = 1)
public class WUFAction extends HttpServlet implements IAction {

    @EJB
    private WUFFacadeRemote engine; 

    public void doPost(HttpServletRequest request, HttpServletResponse response) {

        //Here I should be able to use my engine.
        //Wildfly starts and I call the page, engine is not null at this moment,
        //but after I call the page again, it becomes null and remains null.
    }
}

@Stateless
@Remote(WUFFacadeRemote.class)
public class WUFFacade extends RootFacade implements WUFFacadeRemote, Serializable {
    public WUFFacade() { }

    @EJB
    FUFHome home;

    public ClientData getItems(ClientData data) {
        //code here
    }

    public ClientData save(ClientData data) {
        //code here
    }

    private Col load(ClientData data,InitialContext ic) {
        //here i'm calling home.
        // but home is always null. It was supposed to have the @EJB reference initialized.
        //But instead I get a null pointer...
        home.findByFilter(loader);
    }
}

@Remote(FUFHome.class)
public interface FUFHome {

    FUF create(FUFValue fUFValue);

    FUF findByPrimaryKey(FUFPK  pk);

    Collection findByFilter(FacadeLoader loader);
}



public interface WUFFacadeRemote{
    public ClientData getItems(ClientData data);
    public ClientData save(ClientData data);
}

У меня больше нет ejb-jar.xml, развертывание успешно выполнено, а Wildfly начинается сошибок нет.Затем, когда я в первый раз вызываю страницу, о которой идет речь, кажется, что @EJB работает (Debug - это «Прокси для удаленного EJB StatelessEJBLocator для« bus-фасад / WUFFacade », представление - это интерфейс com.wuf.WUFFacadeRemote, affinity is None»), значение не равно нулю, но для всех последующих вызовов моя переменная равна нулю, и я получил исключение NullPointerException.

Я действительно не знаю, что делаю неправильно (возможно, я полностью потерян),но для меня @EJB должен работать правильно, как это.Что мне не хватает?Спасибо.

Поскольку я использую EJB3.x, я просто сейчас использую аннотации (кажется, это нормально).

JNDI:

Привязки JNDI для сессионного компонента с именем FUF в развертывании

java:global/fumo/bus-entities-fumo/FUF!apyon.components.fumo.fuf.FUF
java:app/bus-entities-fumo/FUF!apyon.components.fumo.fuf.FUF
java:module/FUF!apyon.components.fumo.fuf.FUF
java:global/fumo/bus-entities-fumo/FUF
java:app/bus-entities-fumo/FUF
java:module/FUF

Привязки JNDI для сессионного компонента с именем WUFFacade

java:global/fumo/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:app/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:module/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:jboss/exported/fumo/bus-facade-fumo/WUFFacade!apyon.fumo.wuf.WUFFacadeRemote
java:global/fumo/bus-facade-fumo/WUFFacade
java:app/bus-facade-fumo/WUFFacade
java:module/WUFFacade

1 Ответ

0 голосов
/ 19 октября 2018

Мне кажется, я нашел возможное решение проблемы.Я все еще попытаюсь найти другой, но пока это хорошо.

После перехода на .war и сохранения моих других проектов в .ears он работает.Может быть, проблема была в том, что у меня есть сервлет RootController в моем main.ear, который является отправной точкой приложения.Контекст начинается тут же, а затем перенаправляется на fumo.ear (теперь fumo.war).

По какой-то причине я всегда получал ноль в своем EJB после входа на страницу.Это всегда происходило, когда я впервые заходил в JSP и пытался снова вызвать страницу.Мое решение для этого:

@WebServlet(urlPatterns = "windows/wUF.do", loadOnStartup = 1)
public class WUFAction extends HttpServlet {

    private WUFFacadeRemote engine; 

    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        doPost(req, resp);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) {

        if(engine == null) {
            InitialContext ic; 
            try {
                ic = new InitialContext();
                engine = (WUFFacadeRemote) ic.lookup("java:global/fumo/WUFFacade!fumo.wuf.WUFFacadeRemote");
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }

        //here I always have the context now.
    }
}

И как .war моя структура теперь выглядит так:

enter image description here enter image description here

Так что другие аннотации, такие как @Inject и @EJB, теперь работают.Всегда, когда меня перенаправляют из JSP, вызывающего сервлет или какое-либо действие, я сначала проверяю, имеет ли контекст значение NULL, в противном случае я ищу его.Мои @Stateless работают, а @PersistenceContext и @Remote тоже работают.

 @Stateless
 public class WUFFacade implements WUFFacadeRemote {
     @Inject
     private FUFRules rules;

     @EJB
     private FUFHome home;

    private Col load(ClientData data, InitialContext ic) throws InterfaceException {
        try {
            // home here is nor null anymore.
            Collection res = (Collection) home.findByFilter(loader);
            ...
        } catch (InterfaceException e) {
            e.printStackTrace();
        }
        ...
        return data;
    }
}

Поэтому я хотел бы поблагодарить всех, кто помогал в ветке.Это был хороший способ понять и увидеть проблему или найти обходной путь.Как я уже сказал, в будущем я все еще попробую год, но как упрощенная упаковка он определенно работает.

...