springboot集成webservice发布

远程调用本人通常使用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

结果:和第一种方法返回一样

 同一个接口中的俩个方法,能否分别调用,还在研究中,待续........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值