1. 引入xfire依赖
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-all</artifactId>
<!-- 排除冲突依赖 -->
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
2. 自定义注解用于发布xfire webservice
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface AutoPublishWsXfire {
/**
* Uri string uri地址 及webservice的访问地址.
*
* @return the string
*/
String uri() default "";
}
3. BeanDefinitionRegistryPostProcessor实现XFireExporter导出和uri映射
@Slf4j
public class XfireBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@SneakyThrows
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Properties urlProperties = new Properties();
// 添加XFireExporter
for (String beanDefinitionName : registry.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = registry.getBeanDefinition(beanDefinitionName);
if (beanDefinition instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanDefinition;
if (annotatedBeanDefinition.getMetadata().hasAnnotation(AutoPublishWsXfire.class.getName())) {
Class<?> clzz = Class.forName(annotatedBeanDefinition.getBeanClassName());
AutoPublishWsXfire autoPublishWsXfire = clzz.getAnnotation(AutoPublishWsXfire.class);
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(XFireExporter.class);
Class<?> aClass = Class.forName(beanDefinition.getBeanClassName());
MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
propertyValues.add("serviceFactory", new RuntimeBeanReference("xfire.serviceFactory"));
propertyValues.add("xfire", new RuntimeBeanReference("xfire"));
propertyValues.add("serviceBean", new RuntimeBeanReference(beanDefinitionName));
propertyValues.add("serviceClass", aClass.getInterfaces()[0]);
String xFireName = beanDefinitionName + "-XFireExporter";
registry.registerBeanDefinition(xFireName, genericBeanDefinition);
urlProperties.put(autoPublishWsXfire.uri(), xFireName);
}
}
}
// 添加webservice接口映射
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(SimpleUrlHandlerMapping.class);
MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
propertyValues.add("order", 1);
propertyValues.add("mappings", urlProperties);
registry.registerBeanDefinition(SimpleUrlHandlerMapping.class.getName(), genericBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
log.debug("XFireBeanDefinitionRegistryPostProcessor.postProcessBeanFactory");
}
}
4. 实现config将xfire的依赖和BeanDefinitionRegistryPostProcessor对象添加到spring容器中
/**
* 描述: xfire配置. 参考源码: org/codehaus/xfire/spring/xfire.xml
*
*/
@Configuration
public class XfireConfig {
/**
* Service registry default service registry.
*
* @return the default service registry
*/
@Bean(value = "xfire.serviceRegistry")
public DefaultServiceRegistry serviceRegistry() {
return new DefaultServiceRegistry();
}
/**
* Transport manager default transport manager.
*
* @return the default transport manager
*/
@Bean(value = "xfire.transportManager", initMethod = "initialize", destroyMethod = "dispose")
public DefaultTransportManager transportManager() {
return new DefaultTransportManager();
}
/**
* Xfire default x fire.
*
* @param serviceRegistry the service registry
* @param transportManager the transport manager
* @return the default x fire
*/
@Bean(value = "xfire")
public DefaultXFire xfire(@Qualifier(value = "xfire.serviceRegistry") ServiceRegistry serviceRegistry,
@Qualifier(value = "xfire.transportManager") TransportManager transportManager) {
return new DefaultXFire(serviceRegistry, transportManager);
}
/**
* Type mapping registry default type mapping registry.
*
* @return the default type mapping registry
*/
@Bean(value = "xfire.typeMappingRegistry", initMethod = "createDefaultMappings")
public DefaultTypeMappingRegistry typeMappingRegistry() {
return new DefaultTypeMappingRegistry();
}
/**
* Aegis binding provider aegis binding provider.
*
* @param typeMappingRegistry the type mapping registry
* @return the aegis binding provider
*/
@Bean(value = "xfire.aegisBindingProvider")
public AegisBindingProvider aegisBindingProvider(
@Qualifier(value = "xfire.typeMappingRegistry") TypeMappingRegistry typeMappingRegistry) {
return new AegisBindingProvider(typeMappingRegistry);
}
/**
* Service factory object service factory.
*
* @param transportManager the transport manager
* @param aegisBindingProvider the aegis binding provider
* @return the object service factory
*/
@Bean(value = "xfire.serviceFactory")
public ObjectServiceFactory serviceFactory(
@Qualifier(value = "xfire.transportManager") TransportManager transportManager,
@Qualifier(value = "xfire.aegisBindingProvider") BindingProvider aegisBindingProvider) {
return new ObjectServiceFactory(transportManager, aegisBindingProvider);
}
/**
* Servlet controller x fire servlet controller.
*
* @param xfire the xfire
* @return the x fire servlet controller
*/
@Bean(value = "xfire.servletController")
public XFireServletController servletController(@Qualifier(value = "xfire") XFire xfire) {
return new XFireServletController(xfire);
}
/**
* Message binding provider message binding provider.
*
* @return the message binding provider
*/
@Bean(value = "xfire.messageBindingProvider")
public MessageBindingProvider messageBindingProvider() {
return new MessageBindingProvider();
}
/**
* Message service factory object service factory.
*
* @param transportManager the transport manager
* @param messageBindingProvider the message binding provider
* @return the object service factory
*/
@Bean(value = "xfire.messageServiceFactory")
public ObjectServiceFactory messageServiceFactory(
@Qualifier(value = "xfire.transportManager") TransportManager transportManager,
@Qualifier(value = "xfire.messageBindingProvider") BindingProvider messageBindingProvider) {
ObjectServiceFactory objectServiceFactory = new ObjectServiceFactory(transportManager, messageBindingProvider);
objectServiceFactory.setStyle("message");
return objectServiceFactory;
}
/**
* Xml beans wsdl builder factory xml beans wsdl builder factory.
*
* @return the xml beans wsdl builder factory
*/
@Bean(value = "xfire.xmlbeansWSDLBuilderFactory")
public XmlBeansWSDLBuilderFactory xmlBeansWsdlBuilderFactory() {
return new XmlBeansWSDLBuilderFactory();
}
/**
* Xml beans type registry xml beans type registry.
*
* @return the xml beans type registry
*/
@Bean(value = "xfire.xmlbeansTypeRegistry")
public XmlBeansTypeRegistry xmlBeansTypeRegistry() {
return new XmlBeansTypeRegistry();
}
/**
* Xmlbeans binding provider aegis binding provider.
*
* @param xmlbeansTypeRegistry the xmlbeans type registry
* @return the aegis binding provider
*/
@Bean(value = "xfire.xmlbeansBindingProvider")
public AegisBindingProvider xmlbeansBindingProvider(
@Qualifier(value = "xfire.xmlbeansTypeRegistry") TypeMappingRegistry xmlbeansTypeRegistry) {
return new AegisBindingProvider(xmlbeansTypeRegistry);
}
/**
* Xmlbeans service factory object service factory.
*
* @param transportManager the transport manager
* @param xmlbeansBindingProvider the xmlbeans binding provider
* @param xmlBeansWsdlBuilderFactory the xml beans wsdl builder factory
* @return the object service factory
*/
@Bean(value = "xfire.xmlbeansServiceFactory")
public ObjectServiceFactory xmlbeansServiceFactory(
@Qualifier(value = "xfire.transportManager") TransportManager transportManager,
@Qualifier(value = "xfire.xmlbeansBindingProvider") BindingProvider xmlbeansBindingProvider,
@Qualifier(value = "xfire.xmlbeansWSDLBuilderFactory") WSDLBuilderFactory xmlBeansWsdlBuilderFactory) {
ObjectServiceFactory objectServiceFactory = new ObjectServiceFactory(transportManager, xmlbeansBindingProvider);
objectServiceFactory.setWsdlBuilderFactory(xmlBeansWsdlBuilderFactory);
return objectServiceFactory;
}
/**
* X fire bean definition registry post processor x fire bean definition registry post processor.
* xfire自动转配
*
* @return the x fire bean definition registry post processor
*/
@Bean
public XfireBeanDefinitionRegistryPostProcessor xFireBeanDefinitionRegistryPostProcessor() {
return new XfireBeanDefinitionRegistryPostProcessor();
}
}
5. 实现webservice接口发布
接口类HelloService
public interface HelloService {
/**
* hello.
*
* @return the hello
*/
String hello(String name);
}
实现类HelloServiceImpl
@AutoPublishWsXfire(uri = "/HelloService.ws") // 指定访问地址: http://ip:port/HelloService.ws?wsdl
@Component // 实现自动发布必须将对象添加到spring 容器中
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "hello: " + name;
}
}
6. 测试验证
通过浏览器或者SoapUI等工具访问: http://ip:port/HelloService.ws?wsdl
7. 组件化自动转配(spring boot)
1)spring boot 2.7及之后版本
文件: org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容: 实际包名.XfireConfig
2) spring boot 2.7之前版本
文件: spring.factories
内容:org.springframework.boot.autoconfigure.EnableAutoConfiguration=实际包名.XfireConfig