1. 程式人生 > >Liferay開發過程中的一些常見問題

Liferay開發過程中的一些常見問題

轉自:http://www.huqiwen.com/2013/01/23/liferay-6-1-development-study-18-development-common-problem/

       Build namespace xx build number xxx which is newer than xx


此錯誤常出現在部署工程的時候,錯誤的意思是說當前工程的build number比伺服器上已經部署的小。那這個有什麼影響呢?我們做ServiceBuilder的時候,知道Liferay會自動的更新服務端的資料庫資訊等,Liferay判斷需要不需要更新就是通過這個build number來進行判斷的。如果我們要修復很明顯有兩種方法,一種是修改外掛工程,一種是修改Liferay的資料庫。

方法一:修改外掛工程中的build number

在外掛工程的src下面找到service.properties,開啟找到裡面的build.number,將之修改的比服務端上的build number大,然後重新部署即可。

方法二:修改Liferay的資料庫。

開啟資料庫裡面的servicecomponent表,在裡面找到相應的build numer,將之修改的比外掛工程裡面的小。修改完資料庫要保證修改的資料庫有效,需要我們在控制面板--伺服器管理 執行一下清除資料庫快取。然後重新部署工程。

如何避免此問題出現

此問題的出現,一般是有多人蔘與的專案裡面,使用版本控制工具來維護程式碼,有人提交了,有人沒有提交,要想保持一致,讓大家都及時的提交service.properties檔案,並且如果有衝突的話就選擇build number最大的為準。


 No Liferay Plugin SDK configured on project xxx(sdk配置問題)


一般此問題出現在將工程匯入到Eclipse中時,問題的原因是SDK的位置不正確,有可能有兩個原因:

可能1:在eclipse裡面沒有配置SDK

可能2:工程不是在SDK的相應目錄下面,比如xxx-portlet,要將此工程放到SDK/portlets目錄下面,xxx-theme放到SDK/theme目錄下面,就是不同的工程放到對應的目錄下面


更改D:\sdk\liferay-plugins-sdk-6.2.0,build.properties

遮蔽:
    #app.server.type=tomcat
    #app.server.dir=${project.dir}/../bundles/tomcat-7.0.34
    #app.server.deploy.dir=${app.server.dir}/webapps
    #app.server.lib.global.dir=${app.server.dir}/lib/ext
    #app.server.portal.dir=${app.server.dir}/webapps/ROOT

更改為:
    app.server.type=tomcat
    app.server.parent.dir = D:\\liferay-portal-6.2-ce-ga6
    app.server.tomcat.dir = D:\\liferay-portal-6.2-ce-ga6\\tomcat-7.0.62
    app.server.tomcat.deploy.dir = D:\\liferay-portal-6.2-ce-ga6\\tomcat-7.0.62\\webapps
    app.server.tomcat.lib.global.dir = D:\\liferay-portal-6.2-ce-ga6\\tomcat-7.0.62\\lib\\ext
    app.server.tomcat.manager.user = tomcat
    app.server.tomcat.manager.password = tomcat
    app.server.tomcat.portal.dir =D:\\liferay-portal-6.2-ce-ga6\\tomcat-7.0.62\\webapps\\ROOT

怎麼獲取HttpServletRequest

在一些特殊情況下,我們希望在portlet中使用原生的httpServletRequest,可以使用下面的程式碼獲取,下面分別是renderRequest和actionRequest,可以將renderRequest和actionRequest轉換為HttpServletRequest

HttpServletRequest request = PortalUtil.getHttpServletRequest(renderRequest);

HttpServletRequest request = PortalUtil.getHttpServletRequest(actionRequest);

怎麼獲取UserId,groupId,companyId

Liferay中的二級開發,在設計表的時候強烈建議為每一個表新增groupId和companyId,這樣我們的系統就可以在不同的站點、company下面獨立使用。獲取這些引數的程式碼如下:

Long companyId = PortalUtil.getCompanyId(renderRequest);

Long groupId = PortalUtil.getScopeGroupId(renderRequest);

long userId = PortalUtil.getUserId(request);

如果是獲取User可以直接使用下面的:

User user = PortalUtil.getUser(request);

通過這個方法可以獲取到使用者資訊,得到user之後就可以獲取使用者的其他資訊,如使用者名稱稱、emailaddress、性別等等

Liferay中怎麼獲取當前頁面/導航的名稱

Liferay中的導航其實就是一個個的頁面,這個頁面對應於Liferay中的Layout這個實體,其實要獲取頁面/導航的資訊,只需要獲取到Layout即可。

layout在Jsp中通過下面的兩種方法獲取

Layout layout = (Layout) request.getAttribute(WebKeys.LAYOUT);

或者是新增以下的標籤:

<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>

<liferay-theme:defineObjects />

有了上面的這兩個標籤,即可直接使用layout

layout.getName就是頁面/導航的名稱,通過這個還可以獲取父頁面的資訊,子頁面的資訊等。


表單提交引數的獲取

Liferay對於從Request裡面獲取提交引數進行了一個簡單的封裝,提供了不少便利。

ParamUtil是對引數獲取的一個封裝,可以方便的對獲取到的引數賦予預設值,型別轉換等。Request支援servletRequest和PortletRequest、ActionRequest。下面是一些常用的方法,其他還有一些date了使用方法型別

獲取字串

String title = ParamUtil.getString(request, "title","liferay");

這個程式碼等同於

String title = request.getParameter("title");
 if(title==null){
 title = "liferay";
 }

第三個引數如果為空,則當title為空的時候賦予“”,也就是一個空的字串。

對於long,date,int等還提供了內建的轉換。

 獲取數字

ParamUtil.getInteger(ServletRequest req,String param)

ParamUtil.getInteger(ServletRequest req,String param,int defaultVlue)

如果沒有指定預設值,則預設值為“0”。

ParamUtil.getDouble(ServletRequest req,String param)

ParamUtil.getDouble(ServletRequest req,String param,double defaultVlue)

如果沒有指定預設值,則預設值為0.0。

getFloat、getShort、getLong類似。

獲取boolean

ParamUtil.getBoolean(servlet req,String param)

ParamUtil.getBoolean(servlet req,String param,Boolean default)

這個方法對於引數為:“true”,“t”,“y”,“on”,“1”時會轉化為true,預設為false;如果是其他的情況不要使用。

Liferay中的型別轉換

在開發中常遇到型別的強制轉換,比如將String id = "123"中的id,由String型別,轉換成long型別,我們通常使用下面的程式碼。

long idl = Long.valueOf(id);

但這樣會有一個問題,會出現一個異常,當轉換失敗的時候我們需要處理這個異常,或者我們希望轉換失敗的時候可以賦予一個預設值,這樣寫起來就會有一點複雜,Liferay封裝了一個型別轉換類GetterUtil。上面的程式碼如果使用這個類方法為:

long idl = GetterUtil.getLong(id,1);

這個的意思是說當轉換失敗的時候,為這個idl賦予預設值 1,如果第二個引數不加,則預設值為0。

GetterUtil裡面還有其他常見型別的轉換方法,具體的可以自行查閱API

Liferay中的StringUtil工具類

Liferay中的StringUtil類是我最常使用LiferayAPI,他提供了一些常用方法的封裝。

如將一個字串中的數字提取出來:StringUtil.extractDigits(String s)

如將一個集合(List、陣列)轉換成一個字串,並使用一定的分割符切分:

方法為:merge(Collection<?> col) 和merge(Collection<?> col, String delimiter)

如果不加第二個引數,預設是以英文逗號切分等。

此類比較簡單,看一下API就可以瞭解具體的使用。

Liferay中的驗證工具類

非空檢查、判斷一個字串是不是數字、是不是郵件地址、是不是IP地址、是不是URL地址等,都可以使用此工具類Validator。具體的使用方法看API,比較簡單,不詳述。

Liferay中如何判斷當前執行環境的型別

在一些特殊的情況下,我們需要判斷當前環境的型別,如是執行在tomcat中還是在weblogic或者是其他的中介軟體,因為中介軟體的差異,有些特殊的程式碼,希望為不同的中介軟體編寫特殊的內容。Liferay封裝了一個下面的方法,如果不是在Liferay中使用,有這樣需求的,也可以參考一下Liferay的ServerDetector程式碼。

我們可以使用下面的程式碼判斷。

if(ServerDetector.isTomcat()){//tomcat server
   ……
    }else if(ServerDetector.isWebLogic()){//weblogic server
    ……
    }

在Portlet的類中LanguageUtil.get(Local,key)取不到

會發現在Portlet的控制類,MVC類中使用LanguageUtil.get(local,key)等獲取不到相對應的國際化配置資訊,而這樣的寫法在JSP頁面中是可以取到對應的國際化資訊的,那麼在Portlet類中應該如何取的,可以使用下面的程式碼:

PortletConfig portletConfig =(PortletConfig)renderRequest.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);   
    
ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(WebKeys.THEME_DISPLAY);   
    
System.out.println(LanguageUtil.get(portletConfig,themeDisplay.getLocale(), "key"));