Liferay 6.1開発学習(18):Liferay開発過程におけるよくある問題
7079 ワード
Liferayの開発で出会ったよくある問題と処理技術を記録し、ingを更新し続けます.
Build namespace xx build number xxx which is newer than xx
このエラーは、プロジェクトをデプロイするときによく発生します.エラーは、現在のプロジェクトのbuild numberがサーバ上でデプロイされているものよりも小さいことを意味します.これはどんな影響がありますか?私たちがServiceBuilderをしていたとき、Liferayがサービス側のデータベース情報を自動的に更新することを知っていたなど、Liferayが更新を必要としないと判断したのはこのbuild numberで判断したからです.修復するには、プラグインエンジニアリングを変更する方法と、Liferayのデータベースを変更する方法の2つが明らかです.
方法1:プラグインエンジニアリングにおけるbuild numberの変更
プラグインエンジニアリングのsrcの下にserviceを見つけます.properties中のbuildを開けてnumberは、サービス側のbuild numberよりも大きく変更し、再配置すればよい.
方法2:Liferayのデータベースを変更します.
データベースのservicecomponentテーブルを開き、プラグインエンジニアリングよりも小さく修正します.データベースを変更した後、変更したデータベースが有効であることを保証するには、コントロールパネル--サーバ管理でデータベースキャッシュのクリアを実行する必要があります.その後、プロジェクトを再配置します.
この問題を回避する方法
この問題の発生は、一般的に多くの人が参加しているプロジェクトの中で、バージョン管理ツールを使用してコードを維持し、誰かが提出し、誰かが提出していないので、一致を保つには、みんながタイムリーにサービスを提出するようにします.propertiesファイルで、競合がある場合はbuild numberが最大のものを選択します.
No Liferay Plugin SDK configured on project xxx
この問題は、一般的にEclipseにプロジェクトをインポートするときに発生します.問題の原因は、SDKの位置が正しくないことです.2つの原因がある可能性があります.
おそらく1:eclipseにはSDKが配置されていません
可能性2:プロジェクトはSDKの対応するディレクトリの下ではありません.例えばxxx-portlet、このプロジェクトをSDK/portletsディレクトリの下に置くには、xxx-themeをSDK/themeディレクトリの下に置くには、異なるプロジェクトを対応するディレクトリの下に置くには
HttpServeretRequestの取得方法
特定の場合、portletでオリジナルのhttpServiceletRequestを使用したい場合は、renderRequestとactionRequestのコードを使用して取得できます.renderRequestとactionRequestをHttpServiceletRequestに変換できます.
HttpServletRequest request = PortalUtil.getHttpServletRequest(renderRequest);
HttpServletRequest request = PortalUtil.getHttpServletRequest(actionRequest);
UserId,groupId,companyIdの取得方法
Liferayの2級開発では、テーブルを設計する際に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で次の2つの方法で取得します.
Layout layout = (Layout) request.getAttribute(WebKeys.LAYOUT);
または、次のラベルを追加します.
<%@ taglib uri="http://liferay.com/tld/theme"prefix="liferay-theme"%>
上の2つのラベルがあればlayoutを直接使えます
layout.getNameはページ/ナビゲーションの名前で、親ページの情報、子ページの情報なども取得できます.
フォームコミットパラメータの取得
LiferayはRequestからコミットパラメータを取得するために簡単なパッケージを行い,多くの便利さを提供した.
ParamUtilはパラメータ取得のパッケージであり、取得したパラメータにデフォルト値、タイプ変換などを容易に与えることができる.RequestはservletRequestとPortletRequest、ActionRequestをサポートします.次は一般的な方法ですが、他にもいくつかのdateが使用方法のタイプを示しています.
文字列の取得
このコードは
3番目のパラメータが空の場合、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を与え、2番目のパラメータが加算されなければデフォルト値0を与えることを意味します.
GetterUtilには他にも一般的なタイプの変換方法があり、具体的にはAPIを自分で調べることができます.
LiferayのStringUtilツールクラス
LiferayのStringUtilクラスは私が最もよくLiferayAPIを使用しています.彼はいくつかの一般的な方法のパッケージを提供しています.
文字列の数字を抽出すると、StringUtil.extractDigits(String s)
1つの集合(List、配列)を1つの文字列に変換し、一定の分割子を使用して分割する.
方法:merge(Collectioncol)とmerge(Collectioncol,String delimiter)
2番目のパラメータを追加しない場合は、デフォルトでは英語のカンマで切り分けるなどします.
これは比較的簡単で、APIを見て具体的な使用を知ることができます.
Liferayでの検証ツールクラス
このツール類Validatorは、文字列が数字であるかどうか、メールアドレスであるかどうか、IPアドレスであるかどうか、URLアドレスであるかどうかなどを非空でチェックし、判断するために使用できます.具体的な使い方はAPIを見て、比較的簡単で、詳しく述べません.
Liferayで現在の実行環境のタイプをどのように判断するか
いくつかの特殊な状況では、tomcatで実行されているか、weblogicで実行されているか、または他のミドルウェアで実行されているかを判断する必要があります.ミドルウェアの違いのため、いくつかの特殊なコードがあり、異なるミドルウェアのために特殊な内容を記述したいと考えています.Liferayは以下の方法でカプセル化されており、Liferayで使用されていなければ、このようなニーズがある場合は、LiferayのServer Detectorコードを参照することもできます.
次のコードで判断できます.
PortletのクラスでLanguageUtil.get(Local,key)が取れない
Portletの制御クラス、MVCクラスでLanguageUtilが使用されていることがわかる.get(local,key)などは対応する国際化構成情報を取得できないが、このような書き方はJSPページで対応する国際化情報を取得できるので、Portletクラスでどのように取るべきか、以下のコードを使用することができる.
1. PortletConfig portletConfig =(PortletConfig)renderRequest.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);
2. ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
3. System.out.println(LanguageUtil.get(portletConfig,themeDisplay.getLocale(), "key"));
このようなコードを使用すると、Portletクラスで国際化情報にアクセスできます.
Liferayの「要求は正常に完了しました」を削除します.
Liferayのリクエストの中には、次の図のように「リクエストが正常に完了しました」というプロンプトが表示されます.これはもともと良いもので、ユーザーに要求が成功したことを知らせることができますが、Liferayというデフォルトのヒントは私たちのレイアウトに影響を与えることがあります.以下は2つの削除方法を提供します.
方法1:
対応するportlet.xmlファイルの対応するportletには、次の構成が追加されます.
add-process-action-success-action false
注意:たとえば10個のportletがあります.この情報は10回追加するのは面倒ですが、最初のportletをカスタマイズできるメリットがあります.あるportletにこのようなヒントが必要な場合は、追加しないでください.
方法2:
これは簡単で乱暴な方法で、このヒントのHTMLコードを見て、彼のclass=portlet-msg-successを発見したので、テーマの中でこの内容をCSSで隠して、CSS文を追加することができます:
使用方法1をお勧めします.これはliferayが提供しています.方法2は簡単ですが、乱暴です.これは、このヒントを見たい場合や、liferayを使用したこのヒントにカスタム情報が追加されている場合があります.方法2を使用している場合、これらのカスタムヒント情報も見えません.
Build namespace xx build number xxx which is newer than xx
このエラーは、プロジェクトをデプロイするときによく発生します.エラーは、現在のプロジェクトのbuild numberがサーバ上でデプロイされているものよりも小さいことを意味します.これはどんな影響がありますか?私たちがServiceBuilderをしていたとき、Liferayがサービス側のデータベース情報を自動的に更新することを知っていたなど、Liferayが更新を必要としないと判断したのはこのbuild numberで判断したからです.修復するには、プラグインエンジニアリングを変更する方法と、Liferayのデータベースを変更する方法の2つが明らかです.
方法1:プラグインエンジニアリングにおけるbuild numberの変更
プラグインエンジニアリングのsrcの下にserviceを見つけます.properties中のbuildを開けてnumberは、サービス側のbuild numberよりも大きく変更し、再配置すればよい.
方法2:Liferayのデータベースを変更します.
データベースのservicecomponentテーブルを開き、プラグインエンジニアリングよりも小さく修正します.データベースを変更した後、変更したデータベースが有効であることを保証するには、コントロールパネル--サーバ管理でデータベースキャッシュのクリアを実行する必要があります.その後、プロジェクトを再配置します.
この問題を回避する方法
この問題の発生は、一般的に多くの人が参加しているプロジェクトの中で、バージョン管理ツールを使用してコードを維持し、誰かが提出し、誰かが提出していないので、一致を保つには、みんながタイムリーにサービスを提出するようにします.propertiesファイルで、競合がある場合はbuild numberが最大のものを選択します.
No Liferay Plugin SDK configured on project xxx
この問題は、一般的にEclipseにプロジェクトをインポートするときに発生します.問題の原因は、SDKの位置が正しくないことです.2つの原因がある可能性があります.
おそらく1:eclipseにはSDKが配置されていません
可能性2:プロジェクトはSDKの対応するディレクトリの下ではありません.例えばxxx-portlet、このプロジェクトをSDK/portletsディレクトリの下に置くには、xxx-themeをSDK/themeディレクトリの下に置くには、異なるプロジェクトを対応するディレクトリの下に置くには
HttpServeretRequestの取得方法
特定の場合、portletでオリジナルのhttpServiceletRequestを使用したい場合は、renderRequestとactionRequestのコードを使用して取得できます.renderRequestとactionRequestをHttpServiceletRequestに変換できます.
HttpServletRequest request = PortalUtil.getHttpServletRequest(renderRequest);
HttpServletRequest request = PortalUtil.getHttpServletRequest(actionRequest);
UserId,groupId,companyIdの取得方法
Liferayの2級開発では、テーブルを設計する際に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で次の2つの方法で取得します.
Layout layout = (Layout) request.getAttribute(WebKeys.LAYOUT);
または、次のラベルを追加します.
<%@ taglib uri="http://liferay.com/tld/theme"prefix="liferay-theme"%>
上の2つのラベルがあれば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";
}
3番目のパラメータが空の場合、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を与え、2番目のパラメータが加算されなければデフォルト値0を与えることを意味します.
GetterUtilには他にも一般的なタイプの変換方法があり、具体的にはAPIを自分で調べることができます.
LiferayのStringUtilツールクラス
LiferayのStringUtilクラスは私が最もよくLiferayAPIを使用しています.彼はいくつかの一般的な方法のパッケージを提供しています.
文字列の数字を抽出すると、StringUtil.extractDigits(String s)
1つの集合(List、配列)を1つの文字列に変換し、一定の分割子を使用して分割する.
方法:merge(Collectioncol)とmerge(Collectioncol,String delimiter)
2番目のパラメータを追加しない場合は、デフォルトでは英語のカンマで切り分けるなどします.
これは比較的簡単で、APIを見て具体的な使用を知ることができます.
Liferayでの検証ツールクラス
このツール類Validatorは、文字列が数字であるかどうか、メールアドレスであるかどうか、IPアドレスであるかどうか、URLアドレスであるかどうかなどを非空でチェックし、判断するために使用できます.具体的な使い方はAPIを見て、比較的簡単で、詳しく述べません.
Liferayで現在の実行環境のタイプをどのように判断するか
いくつかの特殊な状況では、tomcatで実行されているか、weblogicで実行されているか、または他のミドルウェアで実行されているかを判断する必要があります.ミドルウェアの違いのため、いくつかの特殊なコードがあり、異なるミドルウェアのために特殊な内容を記述したいと考えています.Liferayは以下の方法でカプセル化されており、Liferayで使用されていなければ、このようなニーズがある場合は、LiferayのServer Detectorコードを参照することもできます.
次のコードで判断できます.
if(ServerDetector.isTomcat()){//tomcat server
……
}else if(ServerDetector.isWebLogic()){//weblogic server
……
}
PortletのクラスでLanguageUtil.get(Local,key)が取れない
Portletの制御クラス、MVCクラスでLanguageUtilが使用されていることがわかる.get(local,key)などは対応する国際化構成情報を取得できないが、このような書き方はJSPページで対応する国際化情報を取得できるので、Portletクラスでどのように取るべきか、以下のコードを使用することができる.
1. PortletConfig portletConfig =(PortletConfig)renderRequest.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);
2. ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
3. System.out.println(LanguageUtil.get(portletConfig,themeDisplay.getLocale(), "key"));
このようなコードを使用すると、Portletクラスで国際化情報にアクセスできます.
Liferayの「要求は正常に完了しました」を削除します.
Liferayのリクエストの中には、次の図のように「リクエストが正常に完了しました」というプロンプトが表示されます.これはもともと良いもので、ユーザーに要求が成功したことを知らせることができますが、Liferayというデフォルトのヒントは私たちのレイアウトに影響を与えることがあります.以下は2つの削除方法を提供します.
方法1:
対応するportlet.xmlファイルの対応するportletには、次の構成が追加されます.
注意:たとえば10個のportletがあります.この情報は10回追加するのは面倒ですが、最初のportletをカスタマイズできるメリットがあります.あるportletにこのようなヒントが必要な場合は、追加しないでください.
方法2:
これは簡単で乱暴な方法で、このヒントのHTMLコードを見て、彼のclass=portlet-msg-successを発見したので、テーマの中でこの内容をCSSで隠して、CSS文を追加することができます:
.portlet-msg-success{
display:none;
}
使用方法1をお勧めします.これはliferayが提供しています.方法2は簡単ですが、乱暴です.これは、このヒントを見たい場合や、liferayを使用したこのヒントにカスタム情報が追加されている場合があります.方法2を使用している場合、これらのカスタムヒント情報も見えません.