Получение javax.Naming.NameNotFoundException при вызове WebMethod в JEE 5 - PullRequest
0 голосов
/ 11 декабря 2018

Я использую JEE версии 5.0.2.Я вызываю WebMethod в аннотированном классе @WebService.Этот аннотированный класс вызывает Stateless @EJB, который содержит бизнес-логику (реализацию) вызываемого мной WebMethod.

Мой класс WebService определен следующим образом:

@WebService
HandlerChain(file = "MyXService_handle.xml")
public class MyXService {

@EJB(mappedName="MyXBean", beanName="MyXBean")
public MyXBean myXBean;

@WebMethod
public String sayHello(@WebParam(name="nTimes") int nTimes) {
    return myXBean.sayHello(nTimes);
   }
}

Мой EJBопределяется следующим образом:

@Stateless(name="MyXBean", mappedName="MyXBean")
@TransactionManagement(TransactionManagementType.BEAN)
public class MyXBean {

@PersistenceContext name="persistence/my_PU", unitName="my_PU")
protected EntityManager entityManager;

public String sayHello(int nTimes) {
    String s = "";
    for (int i = 0; i < nTimes; i++) {
         s += "Hello";
    }
    return s;
    }
}

Я получаю следующую ошибку:

Caused by: com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref com.my.domain.MyXService/myXBean@jndi: MyXBean@null@com.my.domain.MyXBean@Session@MyXBean into class com.sun.enterprise.webservice.JAXWSServlet
    at com.sun.enterprise.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:387)
    at com.sun.enterprise.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:206)
    at com.sun.enterprise.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:117)
    at com.sun.web.server.J2EEInstanceListener.handleBeforeEvent(J2EEInstanceListener.java:259)
    ... 31 more
Caused by: javax.naming.NameNotFoundException: MyXBean#com.my.domain.MyXBean not found
    at com.sun.enterprise.naming.TransientContext.doLookup(TransientContext.java:216)
    at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:188)
    at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74)
    at com.sun.enterprise.naming.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:111)
    at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:409)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.sun.enterprise.naming.NamingManagerImpl.lookup(NamingManagerImpl.java:944)
    at com.sun.enterprise.naming.java.javaURLContext.lookup(javaURLContext.java:173)
    at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:407)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.sun.enterprise.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:287)
    ... 34 more
|#]

Класс WebService и EJB находятся точно в одном модуле в одной и той же WAR.Эта WAR развертывается на сервере Glassfish версии 2.1.1.Я получаю только это предупреждение в журнале развертывания (server.log):

[#|2018-12-10T22:51:59.045+0100|WARNING|sun-appserver2.1|javax.enterprise.system.tools.deployment|_ThreadID=78;_ThreadName=Thread-946;_RequestID=bf2b9b34-5240-4eca-8b4b-9d16baad7c5b;|Unresolved <ejb-link>: MyXBean|#]

Я следую спецификации Java EE 5 для реализации всего этого, поэтому я пытаюсь сделать свою архитектуру "книга ".

Я уже пытался реализовать интерфейс, как описано здесь https://docs.oracle.com/javaee/5/tutorial/doc/bnbmg.html, но безрезультатно, ошибка не исчезла.

У меня нет конфигурации xml, касающейся bean-компонентов,Я ожидал, что все будет работать через аннотации, но я получаю исключение javax.Naming.NameNotFoundException, описанное выше.

Я что-то упустил?Я готов предоставить более подробную информацию, если необходимо.

Спасибо.

1 Ответ

0 голосов
/ 15 декабря 2018

Вы используете имя ejb и отображенное имя.Использование сопоставленного имени зависит от поставщика.Glassfish использует это как «глобальное имя JNDI».Поскольку вы используете оба, я не знаю, какой из них будет иметь приоритет над другим.В вашем примере должны работать пустые аннотации @EJB и @Stateless.

...