如果是编写客户端代码,参见文章:客户端
在SpringBoot和SpringCloud微服务中,整合CXF都是一样的。直接上代码:
引入jar包
这里只给出了CXF先关的jar包,项目中的其他jar依赖略。
<!-- cxf start -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>${cxf-spring-boot-starter-jaxws.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-logging</artifactId>
<version>3.3.1</version>
</dependency>
<!-- cxf end -->
修改配置文件
在默认的情况下,我们服务端发布的接口地址为:http://127.0.0.1:50001/services。在这里,可以在application.properties中,修改这个规则:
cxf.path=/fyk
这个时候,发布的接口地址就为:http://127.0.0.1:50001/fyk。
CXF配置类
首先配置的是CXF的bus总线。这里仅仅是简单的打印出出入站信息:如果要获取报文来保存,参见CXF获取出入站报文
@Configuration
public class CxfConfig {
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus bus = new SpringBus();
bus.getFeatures().add(new LoggingFeature());
return bus;
}
}
关于服务的发布,我打算的是,写一个自定义注解标注要发布的服务类,然后一次性将它们发布出去,这样就不必没写一个接口,就去写一个发布方法:
/**
* 自定义的自动发布客户端注解(通过该注解,就知道要发布哪些服务端接口了)
* @author FYK<br/> 2019年8月16日
* @version 1.0
* @since JDK:1.8
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoPublish {
/**
* 发布地址
* @author FYK
* @return
*/
String publishAddr();
}
@Component
@Slf4j
public class PublishEndpoint implements ApplicationRunner{
@Autowired
private WebApplicationContext webApplicationConnect;
@Autowired()
@Qualifier(Bus.DEFAULT_BUS_ID)
private SpringBus bus;
@SuppressWarnings("resource")
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
//当把应用打成一个jar包运行的时候,后面跟着的命令行参数可以通过ApplicationArguments拿到
log.info("开始进行自动发布web service接口");
String[] beanNames = webApplicationConnect.getBeanNamesForAnnotation(AutoPublish.class);
for(String beanName : beanNames) {
String publishAddr = webApplicationConnect.getType(beanName).getAnnotation(AutoPublish.class).publishAddr();
EndpointImpl endpointImpl = new EndpointImpl(bus, webApplicationConnect.getBean(beanName));
endpointImpl.publish(publishAddr);
log.info(String.format("发布的接口地址:[%s]", publishAddr));
}
log.info("完成web service接口自动发布");
}
}
好了,到目前为止,CXF服务端的基础功能就搭建好了,现在就可以写一些接口来实践一下。
WS接口编写
先写一个接口:
@WebService
public interface SimpleTest {
public String getTestStr(@WebParam(name = "name") String name, @WebParam(name = "age") int age);
}
然后写接口的实现类:(注意,要用上我们自定义的注解@AutoPublish)
@WebService(endpointInterface = "com.boco.fyk.cxf.cxfservice.bussiness.test.SimpleTest", serviceName = "SimpleTest")
@AutoPublish(publishAddr = "test")
@Component
public class SimpleTestImpl implements SimpleTest{
@Override
public String getTestStr(String name, int age) {
String str = String.format("我的名字是:%s,年纪是:%d。", name, age);
return str;
}
}
测试
现在浏览器上访问一下我们的wsdl地址:http://127.0.0.1:50001/fyk/test?wsdl。ok,结果能出来,没有问题。
现在,用SoapUI来测试一下: