如何解决Vaadin 与 Apache CXF SOAP 服务
我是 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 和 the sample project,我认为我可以使用它。
我从 start.vaadin.com 下载了一个新的 Vaadin 14/Java 8 项目,并执行了以下操作:
-
添加依赖
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.4.3</version> </dependency>
-
创建了一个网络服务
import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class Test { @WebMethod public String test() { return "This works"; } }
-
在我的
Application
类中将其作为 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 列出服务定义
第一个文档链接列出了您可以执行的一些配置,例如更改 /services
路径。示例项目展示了如何在需要时配置 Spring 执行器指标。
您可能希望为所有服务 @Configuration
定义创建一个单独的 @Bean
注释类。
如果您不想使用 starter 依赖项,this Baeldung article 看起来很有希望。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。