#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
и ответить, каковы результаты.