带 Spring 启动的 CXF

标签 cxf jax-ws spring-boot

我正在尝试让 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/

相关文章:

java - 难以通过 REST 上传文件

java - 尝试从 Spring Boot 创建 SWING/AWT 框架时由 : java. awt.HeadlessException 引起

java - CXF 不生成枚举映射?

java - 通过代码为 STS/WS-Trust 配置 CXF

java - Web 服务异常 - 没有 "?wsdl"的链接,HTTP GET PATH_INFO

java - 我需要做什么才能接受 web 服务中的数组参数?

ssl - jax-ws tomcat7 ssl证书

java - 用于容器化 postgresql 的 Spring boot 的正确 jdbc 是什么

java - 是否可以使用 CXF 生成可序列化的类?

java - 具有文件输入流和 json 正文的 Web 服务?