webservice入门
官方文档:
http://cxf.apache.org/docs/springboot.html
apache官方示例springboot-cxf-webservice:
https://github.com/apache/cxf/tree/master/distribution/src/main/release/samples/jaxws_spring_boot
-
是什么?
-
WebService采用的是http的soap协议,用来专门用来进行数据交互的,协议的目的就是起到一种规范,他在开发是需要开发人员去专门学习他的语法规范,看起来让开发更加麻烦。但是他的好处也是很多,会在下面进行体现。
-
怎么做?
-
它的组成由服务端和客户端两部门组成,服务端负责提供服务,客户端负责使用服务。
-
那么我们首先进行服务端的开发
-
服务端
-
引入依赖
-
这些需要注意的是cxf依赖的版本和springboot不能相差太大,不然容易版本冲突报错
-
<!-- CXF webservice --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.4.5</version> </dependency>
标注:
1.@WebService
里面方法的含义:
1、servceName=“XXX” //对外发布的服务名
2、targetNamespace=“http://XXX.com” //指定你想要的名称空间,通常使用使用包名反转
3、endpointInterface=“com.XXX.xxService” 服务接口全路径,不是实现类的路径
注:接口写1和2注释即可。实现类1、2、3都写,且3的服务路径指向接口(而不是实现类自己,不然会报找不到方法。特别是接口和实现类不在同一个文件夹,一般实现类都在接口的下一层impl文件夹下)
我们demo中直接全部默认,不写。正式接口最好还是写
2.@WebMethod
该方法为webservice暴露的方法,用于向外公布,它修饰的方法是webservice方法,去掉也没影响的,类似一个注释信息
程序开始:
- 和正常的定义服务一样,我们需要定义一个服务接口,里面定义方法,同时我们需要写一个实现类去实现这个接口和里面的方法。唯一的区别就是它需要在接口和方法上注解@WebService和@WebMethod,例如:(此注解在JDK1.6及其以后版本才支持)
配置文件application.yml添加-
# cxf webservice webservice接口统一路径前缀,所有的webservice接口都回多着一层访问路径
cxf:
path: /demo
代码:
import javax.jws.WebMethod;
import javax.jws.WebService;
/**
* 这是webService的接口
*/
@WebService
public interface WSService {
@WebMethod
public String sayHello(String name);
}
-------------------------它的实现类--------------------
import com.example.service.WSService;
import javax.jws.WebService;
@WebService
@Component // 注入spring里面,省的我们自己一个个new,而且可以使用@Validated+@Valid进行参数校验
public class WSServiceImpl implements WSService {
@Override
public String sayHello(String name) {
return return name+" hello,welcome to our first webService ";
}
}
定义完了服务之后,我们肯定是需要把服务进行发布的,不然别人怎么调用呢,可以配置一个类进行启动,如下:
import com.example.service.WSService;
import com.example.service.impl.WSServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
/** * 配置并发布webService */
@Configuration
public class WSConfig {
@Autowired
private Bus bus;
@Resource
WSService demoService;
/** *用Endpoint发布服务 * @return */
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, demoService);
endpoint.publish("/api");
return endpoint;
}
}
然后直接启动springboot的启动类,在浏览器中输入:http://localhost:8090/demo
得要下面页面,这里如果定义了多个的话可以查看所有demo下面的webService服务,这只有一个。
输入:http://localhost:8090/demo/api?wsdl 得要一下页面
当然也可以在启动类中直接发布服务,如下,两种办法看自己选择哪种
import javax.xml.ws.Endpoint;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args);
//下面是作为发布服务的
String address = "http://127.0.0.1:8090/Webservice";
//使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用,访问时需要在路劲后面加上wsdl,这个方位就直接是http://127.0.0.1:8090/Webservice?wsdl
Endpoint.publish(address , new WSServiceImpl());
System.out.println("发布webservice成功!");
}
}
客户端:
-
这个时候就体现我们遵守协议的好处了,我们得要上面服务端提供的访问地址后,就可以根据他的地址http://localhost:8090/demo/api?wsdl 直接生成我们需要的代码,前提是服务端要开启服务,如下步骤:
-
创建一个springboot项目,
-
注意选择协议,然后分别选择填入地址和选择包路径即可 http://localhost:8090/demo/api?wsdl
-
图上标记为1地方填写我们发布的服务地址http://localhost:8090/demo/api?wsdl
-
图上标记为2地方填写生成代码的路径,点击OK 就能自动生遵循soap协议的本地址的代码,下图中除了springboot的启动类外都是自动生成的。
-
注意:这里JDK1.8自动生成代码可能会报错
-
解决方法:
在jdk的安装路径下,%JAVA_HOME%\jre\lib,添加一个属性文件jaxp.properties,并写上如下内容javax.xml.accessExternalSchema = all
- 接下来把上面的生成的代码引入到我们的项目之中,直接当成本地Java类进行使用。
注意:如果用IDEA生成webservice客户端代码不方便的话直接用JDK也可以
方法是:在一个新文件夹里打开cmd命令符,输入
wsimport -keep http://localhost:8090/demo/api?wsdl
其语法为:
wsimport的用法
wsimport [options] <WSDL_URI>
比较常用的[options]有:
1. -d <directory>
在指定的目录生成class文件
2. -clientjar <jarfile>
在当前目录生成jar文件,结合-d <directory>可以在指定的目录生成jar文件
3. -s <directory>
在指定的目录生成java源文件
4. -p <pkg>
指定生成文件的包结构
5. -keep
在生成class文件,或者jar包时,同时保留java源文件
也能生成代码,把生成的代码复制到你客户端里就行
(其本意就是调用JDK里面的wsimport.exe程序,如果提示报错wsimport不是命令,解决方法
https://blog.csdn.net/qiaodaima0/article/details/104800393)
-
直接调用WSServiceImplService提供的webService接口,我们直接在在测试单元中调用
-
import com.example.WSServiceImplService; 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) @SpringBootTest public class DemoApplicationTests { @Test public void contextLoads() { WSServiceImplService wsServiceImplService=new WSServiceImplService(); String result = wsServiceImplService.getWSServiceImplPort().sayHello("xiaoPeng"); System.out.println("========================================"); System.out.println(result); System.out.println("========================================"); } }
-
启动后结果显示:
- 那么这一个完成的服务端发布服务—>客户端调用服务 的简单demo就已经完成了。
demo下载链接:
链接:https://pan.baidu.com/s/1vAZsgDi6DQKsj9p7Wv51VA
提取码:505a