我们计划将我们的产品升级到Web-logic 12.C和WebSphere 8堆栈(之前是WLC 10.3.5和WAS 7)。但是其中一个Web服务组件中的问题导致整个应用程序无法在Web逻辑中部署。它与WebSphere 8完全兼容。
部署EAR时,Application sever会抛出异常[EclipseLink-59](Eclipse Persistence Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DescriptorException' 。经过更多的分析,我发现下面的一个WebServce依赖类中的代码导致了这个问题,
@ExcludeAttribute
public Map getOperations(){
Map map = new HashMap();
//some operation
return map;
}
@ExcludeAttribute描述了运行时保留策略,其定义如下所示
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExcludeAttribute {
}
getOperations 方法返回java.util.Map,它不能与RunTime保留注释一起使用,但可以与任何其他数据类型一起使用,例如(Integer,Customer等)。我已经改为java.uitl.HashMap而且没有用。
我能够通过使用以下注释
来解决这个问题(我会调用解决方法)@XmlTransient
我没有其他线索为什么它不能使用java.uitl.Map。任何想法真的会竖起大拇指!我已发布到Oracle支持,即使他们还没有回来。 java.util.Map/Collection类与WEblogic12c / Annotations的组合是否存在任何已知问题。
[编辑 - 1]
要回答Doughan问题,返回非集合数据类型的方法不会抛出任何异常,例如:
@ExcludeAttribute
public Integer getOperations(){
return 1;
}
@ExcludeAttribute是自定义注释定义' @Retention(RetentionPolicy.RUNTIME)',我不需要定义@XmlTransient来忽略。
我对使用保留运行时注释感到困惑,并且不确定是否需要保留它或应该使用XMLTransient注释。
[编辑2,基于@Doughan的回答]
我知道如果不从Weblogic 12C映射它们,我们需要显式地注释getter方法(如@XMLTransient),这与RuntTime Retention注释无关。因此,如果有未映射的公共getter方法,任何堆栈升级到12C都应使用此批注更新代码库。我认为几乎可以解决我的担忧。
如果我错了,请纠正我。
现有的代码库已经使用Runtime注释进行了注释,我认为这是导致问题的原因。
详细的堆栈跟踪如下
weblogic.application.ModuleException:[HTTP:101216] Servlet: " com.chordiant.component.cxradecisions.decision.impl.internal.AssessmentDecisionInterfaceWebServiceWrapper" 无法在Web应用程序启动时预加载:" / ra"。
com.sun.xml.ws.spi.db.DatabindingException:Descriptor Exceptions:
异常[EclipseLink-59](Eclipse持久性服务 - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DescriptorException异常 描述:未定义实例变量[responseButtons] 域类[com.chordiant.dm.ra.bean.Assessment],或者不是 无障碍。内部异常:java.lang.NoSuchFieldException: responseButtons映射: org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping [responseButtons] 描述符:XMLDescriptor(com.chordiant.dm.ra.bean.Assessment - > [])
运行时异常:
at com.sun.xml.ws.db.toplink.JAXBContextFactory.newContext(JAXBContextFactory.java:185) at com.sun.xml.ws.spi.db.BindingContextFactory.create(BindingContextFactory.java:179) at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:211) at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:185)
我在评估类
中定义了一个方法getResponseButtons()@ExcludeAttribute
public Map getResponseButtons() {
Map map = new HashMap();
答案 0 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
在WebLogic 12.1.1中,您需要使用@XmlTransient
注释该属性:
@ExcludeAttribute
public Map getOperations(){
Map map = new HashMap();
//some operation
return map;
}
@ExcludeAttribute是我们创建的自定义注释,它使用 @Retention(RetentionPolicy.RUNTIME),(我已经提供了这个片段 注解)
自定义注释不会影响MOXy如何生成其映射元数据。没有办法,只是因为注释被调用@ExcludeAttribute
MOXy不能认为它应该被视为@XmlTransient
。
但是在其中一个Web服务组件中导致整个问题 应用程序无法在Web逻辑中部署。它工作得很好 使用WebSphere 8。
EclipseLink MOXy是WebLogic版本12.1.1中的默认JAXB提供程序。您可能遇到一个问题,以前MOXy仅使用get
方法处理所有属性作为write only
属性。新版本的MOXy将忽略这些属性,除非明确注释它们。这可能会使您看起来@ExcludeAttribute
注释有效。
我对保留运行时注释的使用感到困惑
此设置与您是否可以在运行时通过反射访问此注释有关。您是否出于自己的目的创建自己的注释?
部署EAR时,Application sever会抛出“异常” [EclipseLink-59](Eclipse持久性服务 - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DescriptorException'
如果要映射该属性的内容,您可以共享完整的堆栈跟踪吗?