【问题标题】:RunTime Retention policy java annotations doesn't work in Weblogic 12C运行时保留策略 java 注释在 Weblogic 12C 中不起作用
【发布时间】:2013-06-05 06:20:16
【问题描述】:

我们计划将我们的产品升级到 Web-logic 12.C 和 WebSphere 8 堆栈(之前是 WLC 10.3.5 和 WAS 7)。但是导致整个应用程序无法在 Web 逻辑中部署的 Web 服务组件之一的问题。它与 WebSphere 8 完美配合。

部署 EAR 时,应用程序服务器抛出 'Exception [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 描述 Runtime 保留策略,定义如下所示

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExcludeAttribute {
}

getOperations 方法返回 java.util.Map,它不适用于 RunTime 保留注释,但适用于任何其他数据类型,例如 (Integer, Customer etc) 。我已经改成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 的堆栈都应该使用此注释更新代码库。我认为这几乎可以回答我的担忧。

如果我错了,请纠正我。

现有的代码库已经使用运行时注释进行了注释,我认为这是导致问题的原因。

详细的堆栈跟踪如下

weblogic.application.ModuleException: [HTTP:101216]Servlet: “com.chordiant.component.cxradecisions.decision.impl.internal.AssessmentDecisionInterfaceWebServiceWrapper” 在 Web 应用程序中启动时预加载失败:“/ra”。

com.sun.xml.ws.spi.db.DatabindingException:描述符异常:

异常 [EclipseLink-59](Eclipse 持久性服务 - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException 异常 说明:实例变量 [responseButtons] 未定义在 域类 [com.chordiant.dm.ra.bean.Assessment],或者不是 无障碍。内部异常:java.lang.NoSuchFieldException: 响应按钮映射: 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();

【问题讨论】:

    标签: java weblogic eclipselink moxy weblogic12c


    【解决方案1】:

    注意:我是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),(我提供了这个的sn-p 注释)

    自定义注释不会影响 MOXy 生成其映射元数据的方式。不可能,因为注释被称为@ExcludeAttribute MOXy 不能假设它应该像@XmlTransient 一样对待。

    但其中一个 Web 服务组件中的问题导致整个 应用程序未能在 Web 逻辑中部署。它工作得很好 使用 WebSphere 8。

    EclipseLink MOXy 是 WebLogic 12.1.1 版中的默认 JAXB 提供程序。您可能会遇到一个问题,以前 MOXy 将仅使用 getmethod 的所有属性都视为 write only 属性。 MOXy 的新版本将忽略这些属性,除非它们被明确注释。这可能导致您觉得@ExcludeAttribute 注释正在发挥作用。

    我对保留运行时注释的使用有点困惑

    此设置与您是否可以在运行时通过反射访问此注解有关。您是否出于自己的目的创建自己的注释?

    部署 EAR 时,应用程序服务器抛出 'Exception [EclipseLink-59](Eclipse 持久性服务 - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException'

    如果要映射该属性的内容,您能否分享完整的堆栈跟踪?

    【讨论】:

    • @ExcludeAttribute 是我们自己创建的自定义注解,使用了@Retention(RetentionPolicy.RUNTIME),(我提供了这个注解的sn-p)
    • @Doughan,我已经编辑了我的问题 (edit-1) - 感谢您的输入。
    • 谢谢,我现在有更好的图片,为了方便和可读性更新我自己的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多