接受Liferay门票,开发中的解决方案:https://issues.liferay.com/browse/LPS-82954
我的上下文是通过liferay portlet并行导入liferay布局;用春天建造。当我在Liferay dxp中执行它时; api调用添加一个Layout会抛出一个StaleObjectStateException。 (https://github.com/liferay/liferay-portal/blob/d969e0e839db9ea64267f7bff0a76be93cd26fa0/portal-impl/src/com/liferay/portal/service/impl/LayoutLocalServiceImpl.java)
当api在内部对相应的LayoutSet进行更新时更新此异常(更新该组的PageCount,其中布局已添加到,只是片刻之前)。
在单线程执行中不会发生这种情况!
LayoutSetLocalService.updatePageCount()中有一个Bug:未返回更新的LayoutSet ..因此(使用Liferay 7 / DXP)mvcc版本的LayoutSet不会递增。 ..但这不会对我的情况产生任何影响(https://github.com/liferay/liferay-portal/blob/7eb86ce5f6a7b2c9a405853a20fe81592e639219/portal-impl/src/com/liferay/portal/service/impl/LayoutSetLocalServiceImpl.java)。
任何人都可以给我一个暗示,是否有机会解决这个问题?
- >可用的测试项目:https://github.com/andrebiegel/liferay-layout-issue.git
private static final Object layoutCreationLock = new Object();
synchronized (layoutCreationLock) {
newLayout = addLayoutApiCall(pageContext, serviceContext, typeSettings, friendlyURLMap);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Layout addLayoutApiCall(IPageContext pageContext, ServiceContext serviceContext, String typeSettings,
Map<Locale, String> friendlyURLMap) throws PortalException {
Layout newLayout;
newLayout = LayoutLocalServiceUtil.addLayout( pageContext.getProjectConfiguration().getUserId(), pageContext.getProjectConfiguration()
.getSiteId(), pageContext.isPrivatePage(), pageContext.getParentLayoutId(), pageContext
.getNamesMap(), pageContext.getTitleMap(), pageContext.getDescriptionMap(), pageContext
.getKeywordsMap(), pageContext.getRobotsMap(), pageContext.getPageType(), typeSettings,
pageContext.isHiddenPage(), friendlyURLMap, serviceContext );
return newLayout;
}
答案 0 :(得分:0)
不幸的是,Liferay无法解决此问题。门票已关闭;声明为非用例。原因是该解决方案在其他用例中产生了负面影响。因此,Liferay似乎在其交易管理中存在问题。顺便说一句,当同时添加Expandos时,我也看到了此类异常。