【问题标题】: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 />。为了能够覆盖此方法,您需要创建几个类:
-
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) 的类
- 这个类必须调用
super.setServiceFactory() 传递 org.apache.cxf.jaxws.support.JaxWsServerFactoryBean 并覆盖 getExtraClass()
-
你必须为你自己的命名空间(例如http://cxf.apache.org/jaxws/dynamic)提供你自己的org.apache.cxf.jaxws.spring.NamespaceHandler(你可以创建派生类),这将为jaxws:endpoint元素注册你自己的解析器:
registerBeanDefinitionParser("endpoint", new EndpointDefinitionParser());
(抱歉,我无法提供完整的示例 - 我是根据内存和 CXF 的源代码编写的)