1

ポートレットで Service Builder を使用しています。私のaddProductメソッドは次のPRProductLocalServiceBaseImplとおりです。

public class PRProductLocalServiceImpl extends PRProductLocalServiceBaseImpl {
    public PRProduct addProduct(long companyID, long groupID, String productName,    String serialNumber, long userID) throws SystemException, PortalException{
        PRProduct product = prProductPersistence.create(counterLocalService.increment(PRProduct.class.getName()));
        resourceLocalService.addResources(companyID, groupID, userID, PRProduct.class.getName(), product.getPrimaryKey(), false, true, true);
        product.setProductName(productName);
        product.setSerialNumber(serialNumber);
        product.setCompanyId(companyID);
        product.setGroupId(groupID);        

        return prProductPersistence.update(product, false);
    }
}

ポートレット クラスからこのメソッドを呼び出し、companyID として 1 を渡すと、「キー {companyId=1, name=Owner} を持つロールは存在しません」と表示されます。ここに私のポートレットクラスがあります:

public void addProduct(ActionRequest actionReaquest, ActionResponse actionResponse) 
{   
    PortletSession session = actionReaquest.getPortletSession();
    try
    {
        String productName = actionReaquest.getParameter("productName");
        String userID = actionReaquest.getParameter("userID");
        String companyID = actionReaquest.getParameter("companyID");
        String groupID = actionReaquest.getParameter("groupID");
        String serialNumber = actionReaquest.getParameter("serialNumber");
        PRProduct product = PRProductLocalServiceUtil.addProduct(Long.parseLong(companyID), Long.parseLong(groupID), productName, 
                serialNumber, Long.parseLong(userID));          
        session.setAttribute("errorMessage", "Product added successfully");                         
        actionResponse.setRenderParameter("jspPage", "/ProductAdded.jsp");
    }
    catch(Exception e)
    {
        session.setAttribute("errorMessage", e.getMessage());           
        actionResponse.setRenderParameter("jspPage", "/ProductAdded.jsp");
    }

}

どんな体も助けてくれますか? どんな助けでも事前に感謝します。

4

2 に答える 2

0

おそらく、管理者ユーザーまたは所有者ユーザーとしてコンテンツを追加する必要があります。以下は、コンテンツを追加する前に管理者ユーザーが adminUser パーミッションを設定するようにコンテンツを処理する例です。所有者についても同じことを試してください。

User adminUser = UserLocalServiceUtil.getUserByEmailAddress(companyId,"test@liferay.com");
permissionChecker = PermissionCheckerFactoryUtil.create(adminUser);
PermissionThreadLocal.setPermissionChecker(permissionChecker);

または、以下のコードを使用して所有者を取得します。

Role role=com.liferay.portal.service.RoleLocalServiceUtil.getRole(long companyId,"Owner");

add メソッドを更新し、add メソッドにもう 1 つの引数を追加します。つまりserviceContext、liferay でユーザーを追加するときに行うように、その中のすべてのロール (所有者) を追加します。

于 2012-10-15T06:14:07.677 に答える
0

会社 ID が実際に 1 であるかどうかを確認しましたか?

現在の Liferay ユーザー ID、グループ ID、および会社 ID を取得する最良の方法は、ThemeDisplayオブジェクトを使用することです。したがって、コードを使用する代わりに:

String userID = actionReaquest.getParameter("userID");
String companyID = actionReaquest.getParameter("companyID");
String groupID = actionReaquest.getParameter("groupID");

以下を使用する必要があります。

ThemeDisplay themeDisplay = (ThemeDisplay) actionReaquest.getAttribute(WebKeys.THEME_DISPLAY);
long realUserId = themeDisplay.getRealUserId();
long companyId = themeDisplay.getCompanyId();
long groupId = themeDisplay.getScopeGroupId();

このようにして、自分で値を渡すのではなく、Liferay から値を取得します。Long.parseLong()また、文字列の Long 値を取得する必要がないことも意味します。

これが役立つかどうかを確認してください!また、将来のポートレットでもこの方法を使用することをお勧めします。ThemeDisplay オブジェクトには、多くの有用な情報が含まれています。

また、マイナーなことですが、「request」ではなく「request」と綴られています:)

于 2012-10-15T07:07:48.997 に答える