使用AssetCategoryLocalServiceUtil创建AssetCategory

时间:2013-03-12 12:35:01

标签: nullpointerexception liferay liferay-6

我正在尝试使用AssetCategoryaddCategory方法创建AssetCategoryLocalServiceUtil。但是,我不知道我应该指定什么作为ServiceContext。与LocalServiceUtil类(Group,Organizations)的其他add-methods不同,我推断我不能将ServiceContext设置为null。我已经尝试过,在调用方法时会收到NullPointerExeption。如果我尝试创建一个,只是为了在方法中传递它,我收到一个AssetCategoryNameException。我创建它:

ServiceContext serviceContext = new ServiceContext();
serviceContext.setScopeGroupId(180);   

如何解决上述问题(无异常创建AssetCategory)?

更新:我还需要指定一个词汇表ID。如何获得词汇表(或词汇表列表)才能获得其ID?我尝试了代码:

List<AssetVocabulary> vl = AssetVocabularyUtil.findAll();.
int VocabId = vl.get(0).getVocabularyId();

但它引发了异常:
 org.hibernate.HibernateException:没有Hibernate会话绑定到线程,配置不允许在这里创建非事务性的

我该怎么做才能获得VocabularyId?

2 个答案:

答案 0 :(得分:1)

检查此代码,希望它能为您提供帮助:

// you can particularise your serviceContext as @Jonas Fonseca says
ServiceContext serviceContext = new ServiceContext();
Map<Locale,String> titleMap = new HashMap<Locale, String>();
titleMap.put(Locale.getDefault(), "categoryName");
// vocabularyID needs to point to an existing vocabulary
AssetCategoryLocalServiceUtil.addCategory(userId, parentCategoryId, titleMap, new HashMap<Locale,String>(), vocabularyID, new String[]{}, serviceContext);

当然是关于如何创建AssetCategory的最简单示例,但它运行正常。

<强>更新

如果你需要词汇,你可以这样:

// in case you have vocabulary id
AssetVocabularyLocalServiceUtil.getVocabulary(vocabularyId);
// in case you have the vocabulary name
AssetVocabularyLocalServiceUtil.getGroupVocabulary(groupId, vocabularyName);
// you can get all vocabularies in group
AssetVocabularyLocalServiceUtil.getGroupVocabularies(groupId);
// ...or all vocabularies in portal
int count = AssetVocabularyLocalServiceUtil.getAssetVocabulariesCount();
AssetVocabularyLocalServiceUtil.getAssetVocabularies(0, count);

(请记住调用* LocalServiceUtil方法而不是* Util,这样可以避免Hibernate异常)

答案 1 :(得分:0)

如果您收到AssetCategoryNameException,则表示该名称为invalid,例如为null。

您需要在ServiceContext中设置哪些信息取决于您拨打的服务。至少应该设置userId(将设置为所有者),站点的groupId和companyId。此外,还应设置权限属性,该属性控制谁可以查看资产类别,特别是如果该类别将与资产发布者一起使用,可以根据查看权限过滤内容。

ServiceContext createServiceContext(ThemeDisplay themeDisplay) {
    ServiceContext serviceContext = new ServiceContext();
    serviceContext.setCompanyId(themeDisplay.getCompanyId());
    serviceContext.setScopeGroupId(themeDisplay.getScopeGroupId());
    serviceContext.setUserId(themeDisplay.getUserId());
    serviceContext.setAddCommunityPermissions(true);
    serviceContext.setAddGuestPermissions(true);
    return serviceContext;
}