0

这个问题困扰了我很长一段时间,我希望有人可以在这里帮助我。我正在使用 Service Builder 向我想在我的 portlet 中使用的 JSON Web Service 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 可以看到服务功能,这是我调用它的地方。除了在 ServiceImpl 类上设置 @JSONWebService 之外,我还需要做些什么,因为这是远程调用的?请有人帮我解决这个问题。它把我逼上墙了!

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);
        } 
    }

高温高压

于 2013-07-17T06:01:47.793 回答
0

使用 Liferay 6.1.20 和我使用 maven 和 Liferay 插件版本 6.2.10.9 的构建。

确保您的 MBMessagesAsDiscussionPrimeFinderImpl 类在您的 service.persistence 包/文件夹中。

当服务构建器运行时,它会为您的 WhatFinderImpl 生成接口。在您的情况下,MBMessagesAsDiscussionPrimeFinderImpl。此外,它添加代码以将其实例化到您的 WhatLocalServiceImpl 中。在您的情况下,它似乎是 MBMessagesAsDiscussionPrimeServiceImpl。

如果您的 MBMessagesAsDiscussionPrimeServiceImpl 类等同于 WhatLocalServiceImpl 那么它应该已经在其中实例化了您的 MBMessagesAsDiscussionPrimeFinderImpl 类,您可以将代码更改为以下代码,它将起作用。

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

mBMessagesAsDiscussionPrimeFinder 的骆驼案例可能不同。

于 2015-10-02T19:29:22.880 回答