“File”→“New”→“Project”→“Spring Initializr”……java
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.6</version> </dependency>
这个配置根据实际需求添加,若是不修改server.port,服务器会默认从8080端口启动,为避免冲突,这里设置服务端口为8090。web
server.port=8090
import javax.jws.WebService; @WebService public interface DemoService { public String sayHello(String user); }
import java.util.Date; public class DemoServiceImpl implements DemoService { @Override public String sayHello(String user) { return user+":hello"+"("+new Date()+")"; } }
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 CxfConfig { @Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(),"/demo/*"); } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } @Bean public DemoService demoService() { return new DemoServiceImpl(); } @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), demoService()); endpoint.publish("/api"); return endpoint; } }
直接启动WebserviceApplication,看到服务器正常启动
spring
在浏览器输入http://localhost:8090/demo/ 能够看到系统提供的webservice服务
apache
Web service wsdl url 填入服务端WSDL地址
若是使用的是JDK1.8可能会有bug,生成时报错:因为 accessExternalSchema 属性设置的限制而不容许 ‘file’ 访问, 所以没法读取方案文档 ‘xjc.xsd’。api
org.xml.sax.SAXParseException; systemId: jar:file:/D:/apache-cxf-2.7.11/apache-cxf-2.7.11/lib/jaxb-xjc2.2.6.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: 因为 accessExternalSchema 属性设置的限制而不容许 'file' 访问, 所以没法读取方案文档 'xjc.xsd'。
解决方法:
在jdk的安装路径下,如 C:\Java\jdk1.8.0_65\jre\lib,添加一个属性文件jaxp.properties,并写上以下内容javax.xml.accessExternalSchema = all浏览器
import mypackage.DemoServiceImplService; 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 WebserviceApplicationTests { @Test public void contextLoads() { DemoServiceImplService webServiceImpl = new DemoServiceImplService(); String result = webServiceImpl.getDemoServiceImplPort().sayHello("没有说"); System.out.println("==========================================="); System.out.println(result); System.out.println("==========================================="); } }
执行结果:
服务器
成功集成cxf后,发现只有webservice服务能够正常使用,其余请求url所有没法正常访问。并发
而后在cxf 配置文件中app
WebServiceCxfCfg.java
更改此方法名:public ServletRegistrationBean dispatcherServlet() frontend
@Bean public ServletRegistrationBean disServlet(){ return new ServletRegistrationBean(new CXFServlet() , "/services/*"); }
便可成功访问其余url
评论中说的是public ServletRegistrationBean dispatcherServlet() 把默认映射覆盖掉了,把这个名字改掉,控制类方法就能访问了。
更改此方法明后能够正常其余请求url,webservice服务也正常。