внедрение метода веб-сервиса в управляемый компонент

#jakarta-ee

#джакарта-ee

Вопрос:

Этот метод веб getWsInfoByMethod -сервиса корректно запускается с помощью JUnit test. возврат WsInfo DTO

 @Stateless
@WebService(serviceName = "WsMethodService")
public class WsMethodService implements WebServiceMethodLocal {
  @EJB
  private WebServiceMethodDao webServiceMethodDao;

  public WsMethodService() {
  }

  @Override
  @WebMethod(operationName = "getWsInfoByMethod")
  public WsInfo getWsInfoByMethod(@WebParam(name = "webMethodId") Long webMethodId) throws ServiceFault {
     System.out.println("webServiceMethodDao  "   webServiceMethodDao);
     return webServiceMethodDao.getWebServiceByMethod(webMethodId);
  }

}
 

Теперь я хочу вызвать этот метод в управляемом компоненте «WsFunction».

 @Stateless
public class WsFunction  {
  @EJB
  private WsMethodService ws;

  private WsInfo getWsInfo(String webMethodId) throws ServiceFault{        
    System.out.println("ws "   ws);
    WsInfo wsi = ws.getWsInfoByMethod(Long.valueOf(webMethodId));
    return wsi;
  }
}
 

Но ws разве можно делать инъекции:

 ***ws null
Exception in thread "main" java.lang.NullPointerException
    at mn.interactive.module.meta.expression.function.WsFunction.getWsInfo(WsFunction.java:75);***
 

Как устранить эту ошибку?

Комментарии:

1. Вы запускаете его внутри контейнера (например, JBoss) или вызываете его напрямую? Потому что внедрение происходит только в том случае, если у вас есть кто-то, кто управляет вашими компонентами.

Ответ №1:

Попробуйте @Inject вместо @EJB в вызове WsFunction

Комментарии:

1. Я стараюсь, но это беззаботно

Ответ №2:

WsMethodService должен использоваться только для вызова извне. Вы не должны вводить его. Если вы хотите использовать некоторые из его функций, то вам нужно абстрагировать эту часть в отдельный уровень сервиса. Почему вы не вводите WebServiceMethodDao WsFunction и не вызываете его?

На практике вопрос о внедрении зависит от сервера приложений, вы не указываете, что используете. Также, когда вы вводите EJB, вам нужно ссылаться на interface ( WebServiceMethodLocal ), а не на implementation ( WsMethodService ) .

Комментарии:

1. Привет, win_wave, я использую сервер приложений GlassFish 4.0. Затем я пытаюсь внедрить WebServiceMethodDao: —> открытый класс WsFunction расширяет функцию { @EJB частный WebServiceMethodDao dao; публичная функция WsFunction() { super(«ws»); } частный WsInfo getWsInfo(строка webMethodId) выдает ServiceFault { System.out.println(«dao » dao); WsInfo wsi = dao.getWebServiceByMethod(Long.valueOf(WebMethod id)); возвращает wsi; } }

2. Но dao в это время равно нулю, затем исключение в потоке «main» java.lang. Исключение NullPointerException в mn.interactive.module.meta.expression. функция. WsFunction.getWsInfo(WsFunction.java:74) Как мне внедрить WebServiceMethodDao? И как ссылаться на интерфейс WebServiceMethodLocal

3. Работает ли где-нибудь еще инъекционное введение? Может быть, вы делаете что-то изначально неправильно, что приводит к этому. В общем случае GF должен пытаться разрешать зависимости при развертывании приложения и не иметь исключений с нулевым указателем. Попробуйте использовать @Inject вместо @EJB и ответить, каковы результаты.