Class 在服务生成器中使用复合键时抛出异常

Class cast exception while using composite key in service builder

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

很可能您的 classpath 上有两次 类。当您通过 liferay-plugin-package.properties 定义依赖项时,jars 将在 WEB-INF/lib 中。可能你在全局 classpath tomcat/lib/ext.

上无意中也有相同的 jars

服务jar同时存在于父portlet和子portlet中,在这种情况下我们无法避免。在调试时,即使 PK class 对象是在子 portlet 中创建的,持久性也在使用父 portlet class 加载程序的父 portlet 中发生。这就出问题了。

解决方案是在localserviceImpl 中创建一个方法用于不使用复合PK 的持久化或获取。使用个人 PK 属性创建。使用属性在 localServiceImpl 中创建 PK 并进行获取或持久化。

我听了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;
    }
}