带有 Apache CXF SOAP 服务的 Vaadin

Vaadin with Apache CXF SOAP service

我是 Vaadin 的新手,刚刚在 Vaadin 网站上生成应用程序并在本地构建。然后我向它添加了 Apache CXF SOAP 服务,但我无法使用 Vaadin 正在使用的 Tomcat,而是我在 Jetty 中加载 SOAP 使用:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>${cxf.version}</version>
    <scope>compile</scope>
</dependency>

我的 Vaadin 应用程序是:

@SpringBootApplication
@Theme(value = "iciclient", variant = Lumo.DARK)
@PWA(name = "ICI Client", shortName = "ICI Client", offlineResources = {"images/logo.png"})
public class Application extends SpringBootServletInitializer implements AppShellConfigurator {

    public static void main(String[] args) {
        LaunchUtil.launchBrowserInDevelopmentMode(SpringApplication.run(Application.class, args));
        try {
            System.out.println("Starting IciEventClient");
            Object implementor = new IciEventServiceSoap12Impl();
            String address = "http://localhost:8081/ici/IciEventService";
            Endpoint.publish(address, implementor);
            // http://localhost:8081/ici/IciEventService?WSDL
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

虽然这可行,但我想摆脱单独的 Jetty 依赖和 运行 Vaadin Tomcat (localhost:8080) 中的 SOAP 服务。 应该很简单,但我不知道该怎么做。 我认为它需要一个单独的 servlet 和路由,但我不知道如何添加它们。 例如Vaadin应用中没有web.xml

我不熟悉 Apache CXF,但基于 CXF docs and the sample project 我认为我可以使用它。

我从 start.vaadin.com 下载了一个新的 Vaadin 14/Java 8 项目,并执行了以下操作:

  1. 添加了依赖

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.4.3</version>
    </dependency>
    
  2. 创建了一个网络服务

    import javax.jws.WebMethod;
    import javax.jws.WebService;
    
    @WebService
    public class Test {
    
        @WebMethod
        public String test() {
            return "This works";
        }
    }
    
  3. 在我的 Application class

    中将其作为 bean 公开
    import javax.xml.ws.Endpoint;
    
    import org.apache.cxf.Bus;
    import org.apache.cxf.jaxws.EndpointImpl;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.Bean;
    import org.vaadin.artur.helpers.LaunchUtil;
    import org.vaadin.erik.endpoint.Test;
    
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            LaunchUtil.launchBrowserInDevelopmentMode(SpringApplication.run(Application.class, args));
        }
    
        @Bean
        public Endpoint test(Bus bus) {
            EndpointImpl endpoint = new EndpointImpl(bus, new Test());
            endpoint.publish("/Test");
            return endpoint;
        }
    }
    

就是这样! 至少我现在可以在 http://localhost:8080/services/Test?wsdl

列出服务定义

第一个文档 link 列出了一些您可以执行的配置,例如更改 /services 路径。该示例项目展示了如何配置 Spring 执行器指标(如果您需要的话)。

您可能希望为所有服务 @Bean 定义创建单独的 @Configuration 注释 class。

如果您不想使用入门依赖项,this Baeldung article 看起来很有希望。