2012-02-24 3 views
4

У меня есть класс @WebService, который вводит @EJB. EJB упакован в файл .jar, который находится в том же файле .war, что и классы веб-сервисов. Инъекция @EJB всегда терпит неудачу, но я могу сделать JNDI-поиск в EJB. Я пробовал сделать EJB и его интерфейс @Remote, но это не имело значения. Инъекция все еще не работает, и поиск JNDI по-прежнему работает.@EJB инъекции не удается, но поиск JNDI работает в классе веб-службы в Glassfish

Я использую версию 3.0 web.xml. В файле ejb.jar нет дескриптора развертывания ejb, но это не должно иметь значения в EJB 3.1.

Я что-то пропустил или это ошибка в Glassfish?

Вот мой код.

класс EJB и интерфейс упаковано в .jar в .war файле:

//@Remote 
public interface ReportServiceI { 

    public String testAlive(); 
} 

@Stateless 
//@Remote (ReportServiceI.class) 
public class ReportService implements ReportServiceI {...} 

Веб-сервис класса:

@WebService(
    targetNamespace = "http://www.reps.corp.com/services/reports/ReportService", 
    portName="ReportPort", 
    serviceName="ReportService", 
    endpointInterface="com.corp.reps.reports.ws.server.ReportServiceWSI") 

public class ReportServiceWS implements ReportServiceWSI { 

    public static Logger logger = Logger.getLogger(ReportServiceWS.class); 

// These all fail 
// @EJB 
// @EJB(beanInterface=ReportServiceI.class) 
// @EJB(lookup="java:global/repsreports/ReportService") 
    ReportServiceI reportService; 

    public String testAlive() { 

    // this works 
    try { 
     InitialContext context = new InitialContext(); 
     reportService = (ReportServiceI)context.lookup("java:global/repsreports/ReportService"); 
    } 
    catch (NamingException ex) { 
     logger.error(ex); 

     return "InitialContext.lookup() failed."; 
    } 
+0

Вы пытались использовать '@ Inject' (и предоставляли' beans.xml' на свой путь к классам) или аннотировали компонент '@ WebService' как' @ Stateless' (что делает его EJB)? –

+0

Нет для обоих. beans.xml - это файл CDI, и я использую Glassfish в качестве контейнера для инъекций. Я попробую сделать код @ WebService bean code @ stateless - это единственное, что я не пробовал, но это не обязательно. –

+0

1. Если вы хотите протестировать '@ Inject', вы должны использовать' beans.xml'. Правильно - я хотел проверить, будет ли CDI правильно вводить ваш bean-компонент в WebService. 2. Прочтите спецификацию EJB и документацию сервера приложений, чтобы убедиться, что вы можете вводить/использовать '@ EJB' в веб-сервисах, которые не являются EJB. –

ответ

-1

Петр,

Нет обоим.

beans.xml - это файл CDI, и я использую Glassfish в качестве контейнера для инъекций. Я попробую сделать @WebService bean @stateless - это единственное, что я не пробовал, но это не обязательно.

(Этот форум программное обеспечение не позволит мне добавить комментарий ниже Piotr-х.)

+0

Это не форумное программное обеспечение. Вы не должны публиковать ответ на мой комментарий как «Ответ», поскольку он вводит ненужный беспорядок. Я предлагаю удалить этот «Ответ» и продолжить разговор в комментариях к вашему вопросу. –

+0

Комментарии не могли принимать аннотации. Я попробовал метатеги «code», которые предлагают помощь, но они тоже не работали. –

+0

Если вы используете акцентный ключ (тот, который находится в тильде) вокруг текста, он рассматривается как код, поэтому вы можете поместить '@ Inject'' @ EJB' или что хотите. –