Создание проекта портлета EJB3.1 +

Я просто хочу создать портлет и использовать EJB в этом портлете.

Я использую JBoss 7.1 и Liferay 6.2.

Я создаю проект EJB и проект плагина liferay.

Я просто хочу вызвать метод из EJB, показанный здесь:

@Local
public class PortletController {

 public PortletController() {
 }

 public String getUserName() {
  return "foobar";      
 }
}

Мой портлет пытается получить имя пользователя, показанное здесь:

public class ABPortlet extends MVCPortlet {

private String userName;

@EJB
PortletController controller;


public ABPortlet() {}

public void doView(RenderRequest rr, RenderResponse rp) throws IOException, PortletException {

    userName = controller.getUserName();
    if(userName==null) {
        userName = "nope";
    }
    rr.setAttribute("userName", userName);
    super.doView(rr, rp);
}
}

Я уже сделал что-то не так? Я прочитал в учебнике, что я могу получить доступ к локальному компоненту без поиска, если компонент работает в той же JRE, что и портлет.

Как правильно развернуть оба проекта? Я экспортировал проект EJB как jar и добавил его в качестве зависимости к проекту портлета, но я только что получил исключение NullpointerException в методе doView, в этой строке:

        userName = controller.getUserName();

1 ответ

Решение

Я прочитал в учебнике, что я могу получить доступ к локальному компоненту без поиска, если компонент работает в той же JRE, что и портлет.

Вы имели в виду ту же JVM, когда упомянули JRE, и да, это верно, вам не нужно беспокоиться о поисках JNDI, если ваш портлет и модуль ejb работают оба локально в одном и том же экземпляре JVM.

Относительно того, как вы упаковали свое приложение, я не советую этого делать (ejb и портлет в одном и том же jar-файле), поскольку из лучших практик известно, что вам лучше отделить свой бизнес-модуль (ejb) от модуля просмотра (портлета). Таким образом, вам может потребоваться упаковать каждый из них отдельно, портлет отправляется в военный архив, а ваш ejb - в свой собственный jar/ module один.

Теперь вернемся к вашему коду, у вас есть кое-что, чтобы рассмотреть следующие соглашения о кодировании корпоративных архивов:

Используйте POJI, чтобы объявить ваш локальный скелет бобов:

@Local
public interface PortletControllerLocal 
{
  public String getUserName();
}

Реализуйте свой Stateless/Stateful сессионный компонент и указать его name свойство аннотации:

@Statefull
@EJB(name = "portletControllerBean")
public class PortletControllerBean implements PortletConrollerLocal
{
  public String getUsername()
  {
    //Do you stuff
  }
}

Внедрите свой bean-компонент в класс контроллера портлета с помощью beanName имущество:

public class ABPortlet extends MVCPortlet 
{
  private String userName;
  @EJB(beanName = "portletControllerBean")
  PortletControllerBean controller;

  public ABPortlet() {}

  public void doView(RenderRequest rr, RenderResponse rp) throws IOException,PortletException 
  {
    userName = controller.getUserName();
    if(userName==null) {
      userName = "nope";
    }
    rr.setAttribute("userName", userName);
    super.doView(rr, rp);
  }
}
Другие вопросы по тегам