我只想创建一个Portlet并在此Portlet中使用EJB。
我使用JBoss 7.1和Liferay 6.2。
我创建了一个EJB项目和一个liferay插件项目。
我只想从EJB中调用一个方法,如下所示:
@Local
public class PortletController {
public PortletController() {
}
public String getUserName() {
return "foobar";
}
}
我的portlet尝试获取用户名,如下所示:
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);
}
}
我做错了吗?我在一个教程中读到,如果bean运行在与portlet相同的JRE中,我可以在不查找的情况下访问本地bean。
如何正确部署两个项目?我将EJB项目导出为jar并将其作为依赖项添加到portlet项目中,但我在doView方法中得到了一个NullpointerException,在这一行:
userName = controller.getUserName();
答案 0 :(得分:0)
我在一个教程中读到,如果bean在与portlet相同的JRE中运行,我可以在不查找的情况下访问本地bean。
当你提到 JRE 时,你的意思是在同一个 JVM 中,是的,那是对的,你不必为 JNDI 而烦恼查找您的portlet和ejb模块是否在同一JVM实例中本地运行。
关于打包应用程序的方式,我建议不要这样做(ejb和portlet在同一个jar中),因为从最佳实践中可以看出,您最好将业务模块分开( ejb)来自你的视图模块(portlet)。 因此,您可能需要单独打包每个,portlet转到war存档,ejb转到自己的 jar / module one。
现在回到您的代码,您可以按照企业归档编码约定查看一些内容:
使用POJI声明本地bean骨架:
@Local
public interface PortletControllerLocal
{
public String getUserName();
}
实现您的Stateless/Stateful
会话bean并指定其name
注释属性:
@Statefull
@EJB(name = "portletControllerBean")
public class PortletControllerBean implements PortletConrollerLocal
{
public String getUsername()
{
//Do you stuff
}
}
使用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);
}
}