この問題はかなり長い間私を苛立たせてきました。誰かがここで私を助けてくれることを願っています. 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 クラスに設定する以外に、これがリモートで呼び出されているため、特に何かする必要がありますか? 誰か、これについて私を助けてください。それは私を壁に押し上げています!