1

我在我的portlet 中使用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);
    }
}

当我从我的 portlet 类中调用此方法并将 1 作为 companyID 传递时,它给出“不存在具有键 {companyId=1, name=Owner} 的角色”。这是我的 portlet 类:

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 方法中再添加一个参数,即其中的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 值。

看看这是否有帮助!对于任何未来的 portlet,这样做也是更好的做法。ThemeDisplay 对象包含很多有用的信息!

也是小事,拼写为“request”而不是“request”:)

于 2012-10-15T07:07:48.997 回答