在服务构建器中使用复合键时类强制转换异常

时间:2016-04-19 15:46:51

标签: liferay-6 classcastexception composite-key liferay-service-builder

我有一个使用Liferay服务构建器进行持久化的父portlet。子portlet使用相同的实体进行持久化。所以我使用Liferay插件属性将父portlet添加为子portlet中的依赖项。如果我有实体的单个主键,一切都很好。但是在复合主键实体的情况下,如果我找到使用它的实体,则会发生类别转换异常。我无法找到原因。是因为类加载器问题吗?

3 个答案:

答案 0 :(得分:1)

服务jar存在于父portlet和子portlet中,在这种情况下我们无法避免。在调试时,即使在子portlet中创建了PK类对象,也会使用父portlet类加载器在父portlet中进行持久化。这就产生了问题。

解决方案是在localserviceImpl中创建一个方法,以便在不使用复合PK的情况下进行持久化或提取。使用单独的PK属性创建。使用属性在localServiceImpl中创建PK,然后选择获取或持久性。

答案 1 :(得分:0)

很可能你的classpath上可能会有两次这些课程。当您通过liferay-plugin-package.properties定义相关性时,jars将位于WEB-INF/lib中。可能是您在全球jars classpath上无意中tomcat/lib/ext

答案 2 :(得分:0)

我遵循了San的推荐,没关系:

public class [ENTITY_NAME]LocalServiceImpl extends [ENTITY_NAME]LocalServiceBaseImpl {
    /*
     * NOTE FOR DEVELOPERS:
     *
     * Never reference this interface directly. Always use {@link [ENTITY_NAME]LocalServiceUtil} to access the [ENTITY_NAME] local service.
     */

/* (non-Javadoc)
 * @see [ENTITY_NAME]LocalService#createEntity(java.lang.String, java.util.Date)
 */
    public [ENTITY_NAME] createEntityName(String user, java.util.Date fecha) {
        [ENTITY_NAME]PK entityNamePK = new EntityNamePK();
        [ENTITY_NAME] entityName;
        entityNamePK.setUser(user);
        entityNamePK.setDate(fecha);
        entityName = createEntityName(entityNamePK);
        return entityName;
    }
}