[英]Creating a EJB3.1 + Portlet Project
我只想創建一個Portlet並在此Portlet中使用EJB。
Iam使用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();
我在一個教程中讀到,如果bean在與portlet相同的JRE中運行,則無需查找即可訪問本地bean。
提到JRE時 ,您的意思是在同一個JVM中,是的,如果您的portlet和ejb模塊都在同一JVM實例中本地運行,那么您就不必為JNDI查找而煩惱。
關於打包應用程序的方式,我建議不要這樣做(ejb和portlet在同一jar中),因為從最佳實踐中可以知道,最好將業務模塊 (ejb)與視圖模塊 (portlet)分開。 因此,您可能需要分別打包每個組件,將portlet轉到war歸檔中,並將ejb放入其自己的jar / module中。
現在回到您的代碼,您需要回顧以下企業歸檔編碼約定:
使用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
屬性在portlet控制器類下注入bean:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.