远程调用本人通常使用restful,webservice不太会用,今天先学习记录下,所以有不对的对方请指正!
参考:https://blog.csdn.net/h_j_c_123/article/details/98999064
https://www.jianshu.com/p/e59226c1401a
网上大致看了看,基本上springboot集成的webservice发布主要有俩种发布配置:
1.在springboot启动类中直接发布
2.使用config配置发布
个人总结俩种发布的优缺点是:
启动类中直接发布和config配置发布区别
1.地址区别:启动类配置:端口是可以自定义的,如果服务ip换了,要及时更换对应的ip,有点繁琐
配置类:端口和ip和项目一致
2.注入区别:使用配置类发布,实现类必须要有@service注入声明(@webservice和@service都要有),启动类配置没加也可以(只有@webservice)
3.依赖区别:配置类必须要有cxf依赖
maven依赖
集成需要的依赖:我没有新建项目,直接就可以用,我应该是使用的这个:
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.19</version>
</dependency>
我网上找了几个依赖,我的pom里都没有,如果使用配置类的发布方式,下面的cxf依赖是必须要的
<!--webservice接口-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!--cxf-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.7</version>
</dependency>
接口和实现类正常写就可以,这里使用webservice主要用注解就可以,然后就是注意属性值的写法和关系就可以了
主要使用的注解:
@webservice 在发布的接口类上添加,使用targetNamespace属性命名空间
@WebMethod 在发布的方法上添加
@WebParam 在参数前面添加,可以通过name属性定义参数名称
代码实例:
service
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(targetNamespace="http://service.***.***.web.com/wsdl")
public interface IcostDict {
@WebMethod
CostDict listAll(@WebParam(name="costItemCode")String costItemCode) throws Exception;
}
这里没什么太多要注意的,命名空间是我随意写的,只是把接口的路径写进去后加了后面的后缀
实现类:
import javax.jws.WebService;
@WebService(serviceName = "IcostDictImpl",targetNamespace = "http://service.***.***.web.com/wsdl",endpointInterface = "com.***.***.web.webservice.IcostDict",portName = "do")
public class IcostDictImpl implements IcostDict {
@Autowired
CostDictMapper costDictMapper;
@Override
public CostDict listAll(String costItemCode) {
return costDictMapper.selectByOrderCode(costItemCode);
}
}
注意的问题:
实现类上的@WebService注解中的属性:
serviceName:服务名,这里要写自己的实现类的类名,我试着换了其他,报了404
targetNamespace : 这个和接口类一致就行
endpointInterface : 接口的全路径,从接口上直接把包路径复制过来然后后面加上类名就行,如果不一致启动后会报,找不到类;
portName: 访问路径中要用到
启动类中发布:
import javax.xml.ws.Endpoint;
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
Endpoint.publish("http://localhost:8888/IcostDictImpl/do?wsdl", new IcostDictImpl());
}
}
注意点:
Endpoint.publish 中的路径,ip是发布服务的ip,端口号可以自定义,后面的是在实现类中@webservice中定义的serviceName和portName的值,加上?wsdl 拼接而成。第二个参数是 实现类
可以对照实现类看看:
//@WebService(serviceName = "IcostDictImpl",targetNamespace = "http://service.***.***.web.com/wsdl",endpointInterface = "com.***.***.web.webservice.IcostDict",portName = "do")
//public class IcostDictImpl implements IcostDict {
发布后访问地址:(只有一个方法)
如果在加一个方法的话,返回的xml中包含了所有的方法
返回的结果
配置类发布:
必须要有cxf的依赖
配置类:
import com.***.***.web.service.impl.IcostDictImpl;
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.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
public class CxfConfig {
@Autowired
private Bus bus;
@Autowired
IcostDictImpl icostDictImpl;
/**
* 此方法作用是改变项目中服务名的前缀名,此处127.0.0.1或者localhost不能访问时,请使用ipconfig查看本机ip来访问
* 此方法被注释后:wsdl访问地址为http://127.0.0.1:8080/services/user?wsdl
* 去掉注释后:wsdl访问地址为:http://127.0.0.1:8080/soap/user?wsdl
*
* @return
*/
@Bean
public ServletRegistrationBean disServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/IcostDictImpl/*");
return servletRegistrationBean;
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
/** JAX-WS
* 站点服务
* **/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, icostDictImpl);
endpoint.publish("/do");
return endpoint;
}
}
注意点:
访问地址:http://localhost:8181/IcostDictImpl/do?wsdl
结果:和第一种方法返回一样
同一个接口中的俩个方法,能否分别调用,还在研究中,待续........