1.项目使用springboot 2.1.3版本,集成webservice使用的依赖如下
12 7 8org.springframework.boot 3spring-boot-starter-parent 42.1.3.RELEASE 56 9 org.apache.cxf 10cxf-spring-boot-starter-jaxws 113.2.4 12
2.编写服务接口
1 package com.example.demo.service; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebService; 5 6 @WebService 7 public interface WebServiceTest { 8 9 @WebMethod //声明暴露服务的方法,可以不写10 public String getMsg(String msg);11 }
3.编写业务方法
package com.example.demo.service.impl;import java.util.Random;import javax.jws.WebService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import com.example.demo.service.WebServiceTest;@WebService(targetNamespace="http://service.demo.example.com/", endpointInterface="com.example.demo.service.WebServiceTest")@Componentpublic class WebServiceTestImpl implements WebServiceTest { private static final Logger log = LoggerFactory.getLogger(WebServiceTestImpl.class); @Override public String getMsg(String msg) { log.info("客户端发来的参数:{}",msg); String serviceMsg = "hello,I'm server client."+new Random().nextLong(); return serviceMsg; }}
注意:接口和接口实现类不在同一包下
4.发布服务类
1 package com.example.demo.config; 2 3 import javax.xml.ws.Endpoint; 4 5 import org.apache.cxf.Bus; 6 import org.apache.cxf.jaxws.EndpointImpl; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration;10 11 import com.example.demo.service.WebServiceTest;12 13 @Configuration14 public class CxfConfig {15 16 @Autowired17 private Bus bus;18 19 @Autowired20 private WebServiceTest webServiceTest;21 22 @Bean23 public Endpoint endpoint() {24 EndpointImpl endpoint = new EndpointImpl(bus, webServiceTest);25 endpoint.publish("/user");26 return endpoint;27 }28 }
5.远程访问的地址:http://ip:端口/项目路径/services/user?wsdl 来查看你的wsdl文件
6.客户端调用
在另一项目里,一样需要引入上面的依赖
org.apache.cxf cxf-spring-boot-starter-jaxws 3.2.4
然后:
package com.example.demo;import org.apache.cxf.endpoint.Client;import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringWebserviceClientApplicationTests { @Test public void contextLoads() { } @Test public void test() { // 创建动态客户端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://localhost:8080/services/user?wsdl"); Object[] objects = new Object[0]; try { objects = client.invoke("getMsg", "hello,我是客户端哦!"); System.out.println("返回数据:" + objects[0]); } catch (java.lang.Exception e) { e.printStackTrace(); } }}
提示:我是在springboot测试包里面测试的,你也可以直接写个main方法进行测试。
接下来敲黑板划重点:
1.@WebService(targetNamespace="http://service.demo.example.com/", endpointInterface="com.example.demo.service.WebServiceTest") 这个注解里面targetNamespace是一定要写的,这是指名我们暴露出去的接口在哪,不写映射不到,就会报No operation was found with the name {...}这个错误 ,endpointInterface="com.example.demo.service.WebServiceTest" 这个是告诉接口是哪个
2.请注意targetNamespace最后面有一个斜线,我就是因为没加斜线,老是报上面那个错误,真的是弄了一天,有时候一个小小的符号就够你忙活一天的了。深痛的教训啊。。。。。
3.远程访问地址:http://xxxx/services/user?wsdl 后面加粗部分是固定写法,当然你要是重新配置了这个wsdl的访问路径,就需要使用你配置的,这里就不写怎么配置了,感觉没啥用。。。,有感兴趣的可以百度搜搜看
最后,有不对的欢迎指出纠正!