我正在尝试让 CXF 和 Sprint Boot 更好地发挥作用。我有一个名为 SubscriberApi 的 JAX-WS 服务端点。查看 spring-boot 日志,我看到成功的映射:
Mapping servlet: 'CXFServlet' to [/api/*]
Setting the server's publish address to be /SubscriberApi
但是,点击时我似乎无法获取 WSDL:
http://localhost:8080/api/SubscriberApi?wsdl
@Configuration
@ImportResource({"classpath:META-INF/cxf/cxf.xml"})
public class CxfConfiguration {
@Bean
public SubscriberApi subscriberApi() {
return new SubscriberApi();
}
@Bean
public ServletRegistrationBean servletRegistrationBean() {
CXFServlet cxfServlet = new CXFServlet();
ServletRegistrationBean servletRegistrationBean =
new ServletRegistrationBean(cxfServlet, "/api/*");
servletRegistrationBean.setLoadOnStartup(1);
return servletRegistrationBean;
}
@DependsOn("servletRegistrationBean")
@Bean
public Endpoint jaxwsEndpoint(SubscriberApi subscriberApi){
javax.xml.ws.Endpoint jaxwsEndpoint =
javax.xml.ws.Endpoint.publish("/SubscriberApi", subscriberApi);
return jaxwsEndpoint;
}
}
最佳答案
有一种更简单的方法来运行 Spring Boot 和 Apache CXF 并根据 WSDL 文件提供 SOAP Web 服务:只需使用 cxf-spring-boot-starter ,它会为您做一切。你只需要使用启动器,它是 companion Maven plugin在您的 pom.xml
中,如下所示(完整示例!):
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.codecentric.soap</groupId>
<artifactId>cxf-boot-simple</artifactId>
<version>2.1.2-SNAPSHOT</version>
<packaging>jar</packaging>
<name>cxf-boot-simple</name>
<description>Demo project for using Spring Boot Starter CXF</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>cxf-spring-boot-starter</artifactId>
<version>2.1.2.RELEASE</version>
</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>
<plugin>
<groupId>de.codecentric</groupId>
<artifactId>cxf-spring-boot-starter-maven-plugin</artifactId>
<version>2.0.0.RELEASE</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
将您的 wsdl 放置在 src/main/resources
内的某个位置,实现您的端点类并完成!。这就是一切,没有手动样板编码(没有 ServletRegistrationBean 等)。这是首先根据 WSDL - 100% 契约(Contract)为您生成的。
这也是一个完全可以理解的示例项目:https://github.com/codecentric/spring-samples/tree/master/cxf-boot-simple 。还有一个博文系列,将向您介绍与了解相关的一切:https://blog.codecentric.de/en/2016/10/spring-boot-apache-cxf-spring-boot-starter/玩得开心!
关于带 Spring 启动的 CXF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27113468/