Создание проекта портлета 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);
}
}