2.20. CXF
使用 Apache CXF 公开 SOAP WebServices,或使用 CXF WS 客户端连接到外部 WebServices。
2.20.1. 内部是什么
此端点有两个 URI 格式:
- cxf:bean:cxfEndpoint
- CxfEndpoint 代表一个 bean ID,它引用 Spring bean registry 中的 bean。
- cxf://someAddress
- someAddress 指定 CXF 端点的地址。
有关使用和配置详情,请参阅 CXF 组件。
2.20.2. Maven 协调
在 code.quarkus.redhat.com 上使用此扩展创建一个新项目
或者将协调添加到现有项目中:
<dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-cxf-soap</artifactId> </dependency>
2.20.3. 使用方法
2.20.3.1. General
camel-quarkus-cxf-soap
使用 CXF Extensions for Quarkus 项目的扩展 - quarkus-cxf
。这意味着 quarkus-cxf
提供了一组支持的用例和 WS 规格。
要了解支持的用例和 WS 规格,请参阅 Quarkus CXF 参考。
2.20.3.2. 依赖项管理
Camel Extensions for Quarkus 管理 CXF 和 quarkus-cxf
版本。您不需要为这些项目选择兼容版本。
2.20.3.3. 客户端
使用 camel-quarkus-cxf-soap
(不需要额外的依赖项),您可以在 Camel 路由中使用 CXF 客户端作为制作者:
import org.apache.camel.builder.RouteBuilder; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.SessionScoped; import javax.enterprise.inject.Produces; import javax.inject.Named; @ApplicationScoped public class CxfSoapClientRoutes extends RouteBuilder { @Override public void configure() { /* You can either configure the client inline */ from("direct:cxfUriParamsClient") .to("cxf://http://localhost:8082/calculator-ws?wsdlURL=wsdl/CalculatorService.wsdl&dataFormat=POJO&serviceClass=org.foo.CalculatorService"); /* Or you can use a named bean produced below by beanClient() method */ from("direct:cxfBeanClient") .to("cxf:bean:beanClient?dataFormat=POJO"); } @Produces @SessionScoped @Named CxfEndpoint beanClient() { final CxfEndpoint result = new CxfEndpoint(); result.setServiceClass(CalculatorService.class); result.setAddress("http://localhost:8082/calculator-ws"); result.setWsdlURL("wsdl/CalculatorService.wsdl"); // a resource in the class path return result; } }
CalculatorService
可能类似如下:
import javax.jws.WebMethod; import javax.jws.WebService; @WebService(targetNamespace = CalculatorService.TARGET_NS) public interface CalculatorService { public static final String TARGET_NS = "http://acme.org/wscalculator/Calculator"; @WebMethod public int add(int intA, int intB); @WebMethod public int subtract(int intA, int intB); @WebMethod public int divide(int intA, int intB); @WebMethod public int multiply(int intA, int intB); }
JAX-WS 注释是必需的。不支持简单 CXF Frontend。复杂的参数类型需要 JAXB 注释才能在原生模式下正常工作。
您可以针对实现此服务端点接口的 quay.io/l2x6/calculator-ws:1.2 容器测试此客户端应用程序:
$ docker run -p 8082:8080 quay.io/l2x6/calculator-ws:1.2
Quarkus-cxf
支持使用 @io.quarkiverse.cxf.annotation.CXFClient
注释 注入 SOAP 客户端。如需了解更多详细信息,请参阅 quarkus-cxf
用户指南中的 SOAP 客户端 章节。
2.20.3.4. Server
使用 camel-quarkus-cxf-soap
时,您可以将 SOAP 端点公开为 Camel 路由中的消费者。这个用例不需要额外的依赖项。
import org.apache.camel.builder.RouteBuilder; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Named; @ApplicationScoped public class CxfSoapRoutes extends RouteBuilder { @Override public void configure() { /* A CXF Service configured through a CDI bean */ from("cxf:bean:helloBeanEndpoint") .setBody().simple("Hello ${body} from CXF service"); /* A CXF Service configured through Camel URI parameters */ from("cxf:///hello-inline?wsdlURL=wsdl/HelloService.wsdl&serviceClass=org.foo.HelloService") .setBody().simple("Hello ${body} from CXF service"); } @Produces @ApplicationScoped @Named CxfEndpoint helloBeanEndpoint() { final CxfEndpoint result = new CxfEndpoint(); result.setServiceClass(HelloService.class); result.setAddress("/hello-bean"); result.setWsdlURL("wsdl/HelloService.wsdl"); return result; } }
这两个服务的路径取决于 quarkus.cxf.path
配置属性值,该配置属性值 可在 application.properties
中设置:
application.properties
quarkus.cxf.path = /soap-services
使用这个配置,您可以分别访问 http://localhost:8080/soap-services/hello-bean
和 http://localhost:8080/soap-services/hello-inline
这两个服务。
您可以通过将 ?wsdl
添加到上述 URL 来访问 WSDL。
除非在 100% 确保没有其他扩展需要公开 HTTP 端点,否则不要在应用程序中使用 quarkus.cxf.path = /
。
从 CEQ 2.13.3 开始,quarkus.cxf.path
的默认值为 /
。默认值将阻止其他扩展公开 HTTP 端点。
这会影响 RESTEasy、Vert.x、小型健康等。如果使用其中任何一个,您应该将 quarkus.cxf.path
设置为某些特定路径,如 /services
,这是从 Camel Extensions for Quarkus 3.0.0
/ quarkus-cxf 2.0.0
开始的默认设置。
Quarkus-cxf
支持公开 SOAP 端点的替代方法。如需了解更多详细信息,请参阅 quarkus-cxf
用户指南中的 SOAP 服务章节。
2.20.3.5. 日志记录请求和响应
您可以为使用 org.apache.cxf.ext.logging.LoggingFeature
的客户端和服务器启用 SOAP 消息的详细日志记录:
import org.apache.camel.builder.RouteBuilder; import org.apache.cxf.ext.logging.LoggingFeature; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.SessionScoped; import javax.enterprise.inject.Produces; import javax.inject.Named; @ApplicationScoped public class MyBeans { @Produces @ApplicationScoped @Named("prettyLoggingFeature") public LoggingFeature prettyLoggingFeature() { final LoggingFeature result = new LoggingFeature(); result.setPrettyLogging(true); return result; } @Inject @Named("prettyLoggingFeature") LoggingFeature prettyLoggingFeature; @Produces @SessionScoped @Named CxfEndpoint cxfBeanClient() { final CxfEndpoint result = new CxfEndpoint(); result.setServiceClass(CalculatorService.class); result.setAddress("https://acme.org/calculator"); result.setWsdlURL("wsdl/CalculatorService.wsdl"); result.getFeatures().add(prettyLoggingFeature); return result; } @Produces @ApplicationScoped @Named CxfEndpoint helloBeanEndpoint() { final CxfEndpoint result = new CxfEndpoint(); result.setServiceClass(HelloService.class); result.setAddress("/hello-bean"); result.setWsdlURL("wsdl/HelloService.wsdl"); result.getFeatures().add(prettyLoggingFeature); return result; } }
io.quarkiverse.cxf:quarkus-cxf-rt-features-logging
支持 org.apache.cxf.ext.logging.LoggingFeature
作为 camel-quarkus-cxf-soap
依赖项。
您不需要显式将其添加到应用程序中。
2.20.3.6. WS 规格
支持的 WS 规格的扩展由 Quarkus CXF 项目提供。
要了解支持的用例和 WS 规格,请参阅 Quarkus CXF 参考。
如果您的应用程序需要一些其他 WS 规格,您必须添加涵盖它的 Quarkus CXF 依赖项。
在 Camel Extensions for Quarkus 中,我们支持使用支持级别 Stable
列出的所有扩展。
您可以使用集成测试作为实现各种 WS 规格的应用程序的可执行示例:
2.20.3.7. 工具
Quarkus-cxf
包装以下两个 CXF 工具:
-
wsdl2Java
- 用于从 WSDL 生成服务类 -
java2ws
- 用于从 Java 类生成 WSDL
要使 wsdl2Java
正常工作,您的应用程序必须直接依赖于 io.quarkiverse.cxf:quarkus-cxf
。
虽然不支持 wsdlvalidator
,但您可以使用 wsdl2Java
和 application.properties
中的以下配置来验证 WSDL:
application.properties
quarkus.cxf.codegen.wsdl2java.additional-params = -validate