RunTime保留策略java注释在Weblogic 12C中不起作用

时间:2013-06-05 06:20:17

标签: java weblogic eclipselink moxy weblogic12c

我们计划将我们的产品升级到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();

1 个答案:

答案 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'

如果要映射该属性的内容,您可以共享完整的堆栈跟踪吗?