0

この問題はかなり長い間私を苛立たせてきました。誰かがここで私を助けてくれることを願っています. Service Builder を使用して、ポートレットで使用したいカスタム エンティティを JSON Web サービス API に公開しています。動的クエリは使用できません。後で複数の結合を使用するより複雑なクエリがいくつかあるため、カスタム sql が最適なオプションであると感じています。ただし、openSession() の呼び出しで NPE がスローされるため、クエリを開始することさえできません。これが私のコードです(長さをお詫びしますが、ここで何が間違っているのか本当にわかりません。関連するすべてのものを含めようとしています):

ServiceImpl クラス:

@JSONWebService
public class MBMessagesAsDiscussionPrimeServiceImpl extends MBMessagesAsDiscussionPrimeServiceBaseImpl {
    @Override
    public List<MBMessagesAsDiscussionPrime> getMessagesAsDiscussionPrime() throws SystemException {
        MBMessagesAsDiscussionPrimeFinder finder = new MBMessagesAsDiscussionPrimeFinderImpl();
        return finder.findByGroupId();
    }
}

私の FinderImpl クラス:

public class MBMessagesAsDiscussionPrimeFinderImpl extends BasePersistenceImpl<MBMessagesAsDiscussionPrime> implements MBMessagesAsDiscussionPrimeFinder {

    @Override
    public List<MBMessagesAsDiscussionPrime> findByGroupId() throws SystemException {
        SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory");

        Session session = null;
        try {
            session = sessionFactory.openSession(); //exception here

            //other stuff here, eventually...
        } catch (Exception e) {
            throw new SystemException(e);
        } finally {
            closeSession(session); //throws NPE here
        }
    }
}

カスタム クエリ:

<?xml version="1.0" encoding="UTF-8"?>
<custom-sql>
    <sql
        id="com.test.portlet.service.persistence.MBMessagesAsDiscussionPrimeFinder.findByGroupId">
        <![CDATA[
            SELECT * FROM MBMessage, MBThread
            WHERE
                (MBMessage.threadId = MBThread.threadId) AND
                (MBThread.groupID = ?) 
            ORDER BY
                MBThread.rootMessageId DESC, MBMessage.messageId ASC
        ]]>
    </sql>    
</custom-sql>

およびservice.xml:

<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC
"-//Liferay//DTD Service Builder 6.1.0//EN"
"http://www.liferay.com/dtd/liferay-service-builder_6_1_0.dtd">

<service-builder package-path="com.test.portlet">
    <namespace>MBMessagesAsDiscussionPrime</namespace>

    <entity name="MBMessagesAsDiscussionPrime" uuid="true" local-service="true" remote-service="true">

        <column name="messageId" type="long" primary="true" />
        <column name="threadId" type="long"/>
        <column name="userId" type="long"/>
        <column name="userName" type="String"/>
        <column name="body" type="String"/>

        <reference package-path="com.liferay.portlet.messageboards" entity="MBMessage" />
        <reference package-path="com.liferay.portlet.messageboards" entity="MBThread" />
    </entity>    
</service-builder>

サービス関数は、localhost:8080/custom-query-portlet/api/jsonws から表示されます。ここから呼び出しています。@JSONWebService を ServiceImpl クラスに設定する以外に、これがリモートで呼び出されているため、特に何かする必要がありますか? 誰か、これについて私を助けてください。それは私を壁に押し上げています!

4

2 に答える 2

0

このコードを試してください

 @Override
    public List<MBMessagesAsDiscussionPrime> findByGroupId() throws SystemException {
        Session session = null;
        try {
            session = openSession();

            //other stuff here, eventually...
        } catch (Exception e) {
            throw new SystemException(e);
        } 
    }

HTH

于 2013-07-17T06:01:47.793 に答える
0

Liferay 6.1.20 を使用し、ビルドには Liferay プラグイン バージョン 6.2.10.9 で maven を使用しました。

MBMessagesAsDiscussionPrimeFinderImpl クラスが service.persistence パッケージ/フォルダーにあることを確認してください。

サービス ビルダーが実行されると、WhateverFinderImpl のインターフェイスが生成されます。あなたの場合、MBMessagesAsDiscussionPrimeFinderImpl. さらに、WhateverLocalServiceImpl にインスタンス化するためのコードを追加します。あなたの場合、それは MBMessagesAsDiscussionPrimeServiceImpl のようです。

MBMessagesAsDiscussionPrimeServiceImpl クラスがWhateverLocalServiceImplと同等である場合、その中にインスタンス化されたMBMessagesAsDiscussionPrimeFinderImplクラスがすでにあるはずであり、コードを次のように変更すると機能します。

@JSONWebService
public class MBMessagesAsDiscussionPrimeServiceImpl extends MBMessagesAsDiscussionPrimeServiceBaseImpl {
    @Override
    public List<MBMessagesAsDiscussionPrime> getMessagesAsDiscussionPrime() throws SystemException {
        return mBMessagesAsDiscussionPrimeFinder.findByGroupId();
    }
}

mBMessagesAsDiscussionPrimeFinder のキャメル ケースは異なる場合があります。

于 2015-10-02T19:29:22.880 に答える