<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zy</groupId>
<artifactId>cxf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cxf</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<exclusions><!-- CXF uses java.util.logging by default -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
发布服务
package com.zy.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
@WebService
public interface Hello {
String sayHello(String myname);
}
package com.zy.service.impl;
import com.zy.service.Hello;
import javax.jws.WebService;
import java.util.logging.Logger;
@WebService
public class HelloPortImpl implements Hello {
private static final Logger LOG = Logger.getLogger(HelloPortImpl.class.getName());
public java.lang.String sayHello(java.lang.String myname) {
LOG.info("Executing operation sayHello" + myname);
try {
return "Hello, Welcome to CXF Spring boot " + myname + "!!!";
} catch (java.lang.Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
}
package com.zy.configuration;
import com.zy.service.impl.HelloPortImpl;
import org.apache.cxf.Bus;
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 WebServiceConfig {
//默认服务名称为Service
/* @Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new CXFServlet(),"/WebServices/*");//发布服务名称
}*/
@Autowired
private Bus bus;
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, new HelloPortImpl());
endpoint.publish("/Hello"); //显示要发布的名称
return endpoint;
}
}
启动项目后访问http://localhost:8080/Service/Hello?wsdl
默认路径为Service,可以自定义,我在上面注释了
访问服务,通过cxf下载下wsdl的代码
只需要把接口放到项目中就可以了
package com.zy.consumerservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
/**
* This class was generated by Apache CXF 3.3.3
* 2019-09-06T14:05:28.053+08:00
* Generated source version: 3.3.3
*
*/
@WebService(targetNamespace = "http://service.zy.com/", name = "Hello")
@XmlSeeAlso({})
public interface Hello {
public String sayHello(
@WebParam(name = "arg0", targetNamespace = "")
String arg0
);
}
调用服务的三种方式
package com.zy.cxf;
import com.zy.consumerservice.Hello;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
public class SampleWsApplicationClient {
public static void main(String[] args) throws Exception {
System.out.println(method1());;
System.out.println(method2());;
System.out.println(method3());;
}
// 第一种调用方式:动态调用
public static String method1(){
JaxWsDynamicClientFactory dcflient= JaxWsDynamicClientFactory.newInstance();
Client client=dcflient.createClient("http://localhost:8080/Service/Hello?wsdl");
try {
Object[] results= client.invoke("sayHello", "康骁将");
return results[0].toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 调用方式二,通过接口协议获取数据类型
public static String method2(){
JaxWsProxyFactoryBean jaxWsProxyFactoryBean=new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setAddress("http://localhost:8080/Service/Hello?wsdl");
jaxWsProxyFactoryBean.setServiceClass(Hello.class);
Hello saySomeThing=(Hello) jaxWsProxyFactoryBean.create();
String s = saySomeThing.sayHello("康骁将");
return s;
}
// 调用方式三,通过接口协议获取数据类型,设置链接超时和响应时间
public static String method3(){
JaxWsProxyFactoryBean jaxWsProxyFactoryBean=new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setAddress("http://localhost:8080/Service/Hello?wsdl");
jaxWsProxyFactoryBean.setServiceClass(Hello.class);
Hello saySomeThing=(Hello) jaxWsProxyFactoryBean.create();
Client proxy= ClientProxy.getClient(saySomeThing);
HTTPConduit conduit=(HTTPConduit)proxy.getConduit();
HTTPClientPolicy policy=new HTTPClientPolicy();
policy.setConnectionTimeout(1000);
policy.setReceiveTimeout(1000);
conduit.setClient(policy);
String results = saySomeThing.sayHello("康骁将");
return results;
}
}
//CHECKSTYLE:ON