2010-07-20 1 views
4

Я боролся за это какое-то время.@ EJB в JBoss 5.1.0 GA?

Я пытаюсь перейти на EJB 3.0. Я использую JBoss 5.1.0 GA в качестве моего сервера приложений. Я начал с очень простых сессионных bean-компонентов без состояния с локальным интерфейсом и простого клиента jsp-servlet, который вызывает метод session bean. Все это, пока я пытался использовать аннотацию @EJB, чтобы ввести сеансовый компонент в класс сервлета.

public class SampleServlet extends HttpServlet { 

    @EJB 
    private PersonLocal person; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     System.out.println("In servlet");  
     response.getWriter().write("Person Name : "+person.getName()); 
     System.out.println(person.getName());  
    } 
} 

Я использую JBoss 5.1.0 GA с конфигурацией по умолчанию . (Я также пробовал с все конфигурации)

Однако, я использовал, чтобы получить нулевую ссылку на сессию bean injection. После битвы в течение дня или около того я, наконец, попробовал уродливый метод поиска EJB 2.x JNDI вместо аннотации @EJB с настройкой для jndi, указанной в файле jndi.properties, и он работал без каких-либо изменений!

Теперь я попытался выяснить в JBoss документы о том, поддерживает ли JBoss 5.1.0 GA или не поддерживает инъекцию с аннотацией @EJB, но не может найти конкретного ответа. Так может кто-нибудь сказать мне, не так ли? потому что я бы предпочел аннотацию к поиску JNDI (я имею в виду, кто не будет?). Я что-то упускаю..?

Вероятно, следовало бы поставить это на форумах JBoss, но .. Я пристрастился к этому месту ;-)

+0

С какой конфигурацией сервера JBoss вы используете? 'all',' default', 'minimum' и т. д. – skaffman

+2

Также, пожалуйста, покажите нам некоторый код, например. сервлет – skaffman

+0

добавил код и конфигурацию сервера к вопросу. :) – Nikhil

ответ

5

Это, безусловно, поддерживается JBoss 5.x, поскольку она является Java EE 5 сертифицированы.

На самом деле, я предлагаю проверить Chapter 11. Introduction to EJB injection in ServletsJBoss EJB3 Tutorials, они описывают подробный и пошаговый пример.

И обратить особое внимание на следующее примечание:

Для инъекций пройдет в веб-модулем, ваш web.xml должен использовать версии 2.5 в веб-приложение XSD:

<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
+3

Интересно, сколько вопросов сервлета/jsp на SO были решены путем исправления версии веб-приложения ..... – skaffman

+1

Это исправлено! :) Я должен был прочитать учебники перед погружением, но в любом случае .. Я выучил хороший урок. Спасибо большое! :) – Nikhil

+0

Есть ли какие-либо другие gotacha, подобные этим при использовании обычных Java-клиентов? Или мы можем вводить в Java-клиенты, как есть? – Nikhil

1

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

Вот что работает для меня:

//bean 
@Stateless(name="xxxxService") 
@Remote(xxxxRemote.class) 
public class xxxxService implements xxxxRemote { 

//interface - note that no annnotation is required 
public interface xxxxRemote { 

//in the client 
    @EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName=' 
    private xxxxRemote xxxx; 

Для моего проекта (построен с Maven), клиент в веб-приложение, и EJB находится в EJB проекта, который заворачивали в проекте EAR. Отображение JNDI происходит в jboss.xml, который живет в проекте EJB (в моем проекте, SRC/основные/ресурсы/META-INF), и выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema" 
     xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" 
     version="5.0"> 
    <enterprise-beans> 
    <session> 
     <ejb-name>xxxxService</ejb-name> 
     <jndi-name>myJndiNameForxxxx</jndi-name> 
    </session> 
    </enterprise-beans> 
</jboss> 

Вот и все прошло, и теперь Я могу получить доступ к EJB от клиента. Надеюсь, это поможет кому-то.

Если у вас все еще есть проблемы, вы можете посмотреть на консоли JMX, чтобы убедиться, что запись JNDI отображается. Посмотрите в разделе «jboss»> «service = JNDIview»> «list» и нажмите кнопку «invoke». Если ваша служба развернута правильно, вы должны увидеть имя JNDI (в моем примере, myJndiNameForxxxx) в разделе «ProxyFactory».

+0

Ваш ответ не очень подходит к заданному вопросу, но все же, как вы сказали, может быть полезно кому-то! – Nikhil