SpringBoot项目中使用CXF发布和调用webservice接口

文章目录

  • 1. 服务端发布webservice接口
    • 1.1. 引入依赖
    • 1.2. 编写接口
    • 1.3. 实现接口
    • 1.4. 发布webservice接口
    • 1.5. 发布多个webservice接口
    • 1.6. 测试
    • 1.7. 问题
  • 2. 客户端调用webservice接口
    • 2.1. 问题

1. 服务端发布webservice接口

1.1. 引入依赖


    <dependency>
        <groupId>org.apache.cxfgroupId>
        <artifactId>cxf-rt-frontend-jaxwsartifactId>
        <version>3.1.12version>
    dependency>
    <dependency>
        <groupId>org.apache.cxfgroupId>
        <artifactId>cxf-rt-transports-httpartifactId>
        <version>3.1.12version>
    dependency>

1.2. 编写接口

package com.hdn.webservice.service;

import javax.jws.WebMethod;
import javax.jws.WebService;

//@WebService用于对接口,类进行注解,表示要发布的web服务
@WebService
public interface WS {
    //@WebMethod  注释表示作为一项 Web Service 操作的方法,此外 仅支持在使用 @WebService 注释来注释的类上使用 @WebMethod 注释
    @WebMethod
    String getMsg();
}

@WebService 用于对接口,类进行注解,表示要发布的web服务
@WebMethod 注释表示作为一项 Web Service 操作的方法,此外 仅支持在使用 @WebService 注释来注释的类上使用 @WebMethod 注释
@WebParam(name = “param”) 如果接口需要参数,就要使用@WebParam注解

1.3. 实现接口

package com.hdn.webservice.service;

import javax.jws.WebService;

//targetNamespace是指定你想要的名称空间,一般是使用接口实现类的包名
//endpointInterface是服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口
@WebService(targetNamespace = "http://com.hdn.webservice.service/",
        endpointInterface = "com.hdn.webservice.service.WS")
public class WSImpl implements WS {
    public String getMsg() {
        return "调用到了webservice接口";
    }
}

targetNamespace 是指定你想要的名称空间,一般是使用接口实现类的包名
endpointInterface 是服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口

1.4. 发布webservice接口

package com.hdn.webservice.service;

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;

@Configuration
public class WSConfig {
    //默认servlet路径/*,如果覆写则按照自己定义的来
    @Bean("dispatcherServletCxf")
    public ServletRegistrationBean wsDispatcherServlet(){
        return new ServletRegistrationBean(new CXFServlet(),"/businessSystem/services/*");//发布服务名称
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    //把实现类交给spring管理
    @Bean
    public WS webService() {
        return new WSImpl();
    }

    //终端路径
    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(),webService());
        endpoint.publish("/testWS");
        return endpoint;
    }
}

1.5. 发布多个webservice接口

如果需要发布多个webservice接口,就如同上面分别编写接口、实现接口、然后在WSConfig中进行webservice的发布即可。

1.6. 测试

浏览器中输入:127.0.0.1:8080/businessSystem/services/ (该路径是在WSConfig中定义的):
SpringBoot项目中使用CXF发布和调用webservice接口_第1张图片
点击 {http://com.hdn.webservice.service/}WSImplService 就可以访问wsdl文件:
SpringBoot项目中使用CXF发布和调用webservice接口_第2张图片

到这里,我们的webservice接口就已经成功发布了!!!

可以使用soupui工具来调用webservice接口。

1.7. 问题

在WSConfig中发布服务名称时,会报如下错误:
SpringBoot项目中使用CXF发布和调用webservice接口_第3张图片
解决办法:
这是因为没有引入spring-boot-starter-web依赖,在pom.xml中引入该依赖即可:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

2. 客户端调用webservice接口

package com.hdn.webservice.client;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class webserviceclient {
	public static void main(String[] args) throws Exception  {
	JaxWsDynamicClientFactory dcflient=JaxWsDynamicClientFactory.newInstance();
	//webservice地址
        Client client=dcflient.createClient("http://127.0.0.1:8080/businessSystem/services/testWS?wsdl");
        Object[] objects;
        System.out.println("hello !");
        try {
            //方法名  参数1 参数2 ...
			objects = client.invoke("getMsg");
			System.out.println("返回结果:"+objects[0].toString());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("出错了"+e.toString());
		}
	}
}

2.1. 问题

在使用客户端调用webervice的时候,服务端提供的webservice接口上@WebService注解必须添加targetNamespace,否则会报如下错误:
SpringBoot项目中使用CXF发布和调用webservice接口_第4张图片
解决办法:
在服务端提供的webservice接口上@WebService注解添加targetNamespace:
SpringBoot项目中使用CXF发布和调用webservice接口_第5张图片

你可能感兴趣的:(Spring,Boot,java,小实例)