0

こんにちは、Liferay SKD for Java と Liferay 6.1(Tomcat) を使用しています。次のようにカスタムデータベースを作成しました。

<entity name="PCustomer" local-service="true" remote-service="false">

    <!-- PK fields -->
    <column name="customerId"           type="int" primary="true" />
    <!-- Audit fields -->
    <column name="name"                 type="String"/> 
    <column name="vAddress"             type="String"/>
    <column name="pAddress"             type="String"/>
    <column name="comments"             type="String"/>
    <column name="pusers"               type="Collection"       entity="PUser"      mapping-key="userId"/>
    <column name="pcontacts"            type="Collection"       entity="PContact"   mapping-key="contactId"/>
    <column name="pdemos"               type="Collection"       entity="PUserDemo"  mapping-key="demoId"/>
    <column name="plicenses"            type="Collection"       entity="PLicense"   mapping-key="licenseId"/>
    <column name="pfolders"             type="Collection"       entity="PFolder"    mapping-key="folderId"/>

</entity>

Service.xml を使用して、特定の顧客に関連付けられているすべての連絡先を取得したいと考えています。問題は、JSP ページでこれを行うと、次のようになることです。

<%
    String user = request.getRemoteUser();
    int userId = Integer.valueOf(user);
    PUser pUser=PUserLocalServiceUtil.getPUser(userId);
    int customerId = pUser.getCustomerId();

     PCustomer customer=PCustomerLocalServiceUtil.getPCustomer(customerId);

     java.util.List<PContact> contCus=PCustomerUtil.getPContacts(customerId);
%>

そして、for each ループを使用して、このリストを調べてみてください。

%for (PContact pContact : contCus) 
    if(pContact.getUserType().equals("billing"))
    {%> DO SOMETHING <% } %>

それは私にエラーを与えます:

java.lang.ClassCastException: $Proxy288 は com.myportlet.service.persistence.PCustomerPersistence にキャストできません

私はそれをデバッグし、すべての値はOKで、JSPページでリストを作成しようとするまで機能しています。問題は、そのページで、そのようなリストを作成する必要があることを示していることです。このパラメーターなどを使用します。エラーは発生しません。

誰かが私を助けたり、私が間違っていることを教えてくれますか?

どんな助けでも大歓迎です。前もって感謝します!!!!

4

2 に答える 2

0

これはJavaコレクションや反復とは何の関係もないと思います...

コードのどこかで、Spring マネージド Bean を具象クラスにキャストしようとしているようです。問題は、Spring AOP がプロキシを使用して Bean をラップすることです。この状況では、プロキシが元のクラスと同じ一連のインターフェースを実装していると想定することしかできません。奇妙なことに、サービス ビルダーを使用してサービスを生成しているため、PCustomerPersistence は既にクラスではなくインターフェイスである必要があります。

ところで、サービスの外部から PCustomerUtil (またはサービス ビルダーによって生成された他のエンティティの同等のクラス) を呼び出さないでください。これらのクラスは永続層からメソッドを直接公開するため、JSP やポートレットからではなく、サービスからのみ呼び出す必要があります。

于 2013-05-15T19:41:06.397 に答える