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-beanhttp://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 正常工作,您的应用程序必须直接依赖于 io.quarkiverse.cxf:quarkus-cxf

提示

虽然不支持 wsdlvalidator,但您可以使用 wsdl2Javaapplication.properties 中的以下配置来验证 WSDL:

application.properties

quarkus.cxf.codegen.wsdl2java.additional-params = -validate

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.