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;
}
}
我有一个父 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;
}
}