当使用XMLAccess进行Portlet发布时, 如果portlet.xml中的<portlet-app>标签没有定义id属性时,可以在XMLAccess请求脚本中使用WAR文件名来定义uid, 示例如下:
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PortalConfig_7.0.0.xsd" type="update" create-oids="true"> <portal action="locate"> <web-app action="update" active="true" uid="WAR_FILE_NAME.webmod"> <url>file:///PATH_TO_THE_WAR_FILE</url> <portlet-app action="update" active="true" uid="WAR_FILE_NAME"> <portlet action="update" active="true" name="TestPortlet" objectid="theTestPortlet" /> </portlet-app> </web-app> </portal> </request>
当使用该脚本来安装一个新的portlet时, 工作正常, 但如果重复运行该脚本以更新一个已安装的portlet时, XMLAccess报错提示DuplicateAppException EJPPF0181E The id=XXX already exists for stored standard portlet application。
解决方法是在XMLAcess脚本的<web-app>标签中添加一个uniquename属性, 示例如下:
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PortalConfig_7.0.0.xsd" type="update" create-oids="true"> <portal action="locate"> <web-app action="update" active="true" uid="WAR_FILE_NAME.webmod" uniquename="SOME_UNIQUE_NAME"> <url>file:///PATH_TO_THE_WAR_FILE</url> <portlet-app action="update" active="true" uid="WAR_FILE_NAME"> <portlet action="update" active="true" name="TestPortlet" objectid="theTestPortlet" /> </portlet-app> </web-app> </portal> </request> 如此,该脚本可用于安装新的portlet, 也可根据uniquename属性值来更新一个已安装的portlet。