带有 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 项目,并执行了以下操作:
添加了依赖
<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
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 看起来很有希望。
我是 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 项目,并执行了以下操作:
添加了依赖
<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"; } }
在我的
中将其作为 bean 公开Application
classimport 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 看起来很有希望。