【问题标题】:Possible to use the @XmlSeeAlso dyncamiclly?可以动态使用@XmlSeeAlso 吗?
【发布时间】:2012-01-06 14:14:40
【问题描述】:

而不是这个

@XmlSeeAlso({User.class,Role.class,Function.class})

我想要这样的东西:

@XmlSeeAlso(Access.getWebServiceClasses())

有可能吗?

我想要这个,因为我的 web 服务只包含接口,如果我更改实现,我只想在我的工厂中进行更改,以便它返回正确的类,而不必更改 web 服务本身。

【问题讨论】:

    标签: java web-services jaxb cxf


    【解决方案1】:

    不可能,因为注释元素必须是简单类型(字符串、原语或类(参见annotations)。

    但是(在 CXF 中)可以覆盖 org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.getExtraClass() 方法,默认情况下检查接口的 @XmlSeeAlso。我的实现返回了额外的 ObjectFactory 类。

    您可能在 CXF 的 Spring XML 配置中使用了<jaxws:endpoint />。为了能够覆盖此方法,您需要创建几个类:

    1. org.apache.cxf.jaxws.spring.EndpointDefinitionParser 必须使用派生自 org.apache.cxf.jaxws.spring.EndpointDefinitionParser.SpringEndpointImpl(使用 JAXWS 2.1 时)或派生自 org.apache.cxf.jaxws22.spring.JAXWS22SpringEndpointImpl (JAXWS 2.2) 的类
    2. 这个类必须调用 super.setServiceFactory() 传递 org.apache.cxf.jaxws.support.JaxWsServerFactoryBean 并覆盖 getExtraClass()
    3. 你必须为你自己的命名空间(例如http://cxf.apache.org/jaxws/dynamic)提供你自己的org.apache.cxf.jaxws.spring.NamespaceHandler(你可以创建派生类),这将为jaxws:endpoint元素注册你自己的解析器:

      registerBeanDefinitionParser("endpoint", new EndpointDefinitionParser());

    (抱歉,我无法提供完整的示例 - 我是根据内存和 CXF 的源代码编写的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2010-09-05
      • 2021-09-15
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多