2.27. CXF


使用 Apache CXF 公开 SOAP WebServices,或使用 CXF WS 客户端连接到外部 WebServices。

2.27.1. 什么是内部

  • cxf 组件, URI 语法: cxf:beanId:address

有关用法和配置详情,请参阅上述链接。

2.27.2. Maven 协调

在 code.quarkus.redhat.com 上使用此扩展创建新项目

或者将协调添加到现有项目中:

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-cxf-soap</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap

2.27.3. 使用方法

2.27.3.1. General

camel-quarkus-cxf-soap 使用 CXF Extensions for Quarkus 项目的扩展 - quarkus-cxf。这意味着支持的用例和 WS 规格由 quarkus-cxf 提供。

重要

要了解支持的用例和 WS 规格,请参阅 Quarkus CXF 参考

2.27.3.2. 依赖项管理

CXF 和 quarkus-cxf 版本由 {project-name} 管理。您不需要为这些项目选择兼容版本。

2.27.3.3. 客户端

使用 camel-quarkus-cxf-soap (不需要额外的依赖项),您可以在 Camel 路由中使用 CXF 客户端作为制作者:

import org.apache.camel.builder.RouteBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.SessionScoped;
import jakarta.enterprise.inject.Produces;
import jakarta.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;
    }
}
Copy to Clipboard Toggle word wrap

CalculatorService 可能类似如下:

import jakarta.jws.WebMethod;
import jakarta.jws.WebService;

@WebService(targetNamespace = CalculatorService.TARGET_NS) 
1

public interface CalculatorService {

    public static final String TARGET_NS = "http://acme.org/wscalculator/Calculator";

    @WebMethod 
2

    public int add(int intA, int intB);

    @WebMethod 
3

    public int subtract(int intA, int intB);

    @WebMethod 
4

    public int divide(int intA, int intB);

    @WebMethod 
5

    public int multiply(int intA, int intB);
}
Copy to Clipboard Toggle word wrap
1 2 3 4 5
注意:需要 JAX-WS 注释。不支持 Simple CXF Frontend。复杂的参数类型要求 JAXB 注释在原生模式下工作。
提示

您可以针对实施此服务端点接口的 quay.io/l2x6/calculator-ws:1.2 容器来测试此客户端应用程序:

docker run -p 8082:8080 quay.io/l2x6/calculator-ws:1.2
Copy to Clipboard Toggle word wrap
注意

quarkus-cxf 支持使用 @io.quarkiverse.cxf.annotation.CXFClient 注释 注入 SOAP 客户端。如需更多详细信息,请参阅 quarkus-cxf 用户指南中的 SOAP 客户端 章节。

2.27.3.4. 服务器

使用 camel-quarkus-cxf-soap,您可以在 Camel 路由中将 SOAP 端点公开为消费者。这个用例不需要额外的依赖项。

import org.apache.camel.builder.RouteBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Produces;
import jakarta.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;
    }
}
Copy to Clipboard Toggle word wrap

提供这两个服务的路径取决于 quarkus.cxf.path配置属性的值,该配置属性 可在 application.properties 中设置:

application.properties

quarkus.cxf.path = /soap-services
Copy to Clipboard Toggle word wrap

此配置就位后,可以在 http://localhost:8080/soap-services/hello-beanhttp://localhost:8080/soap-services/hello-inline 下分别访问这两个服务。

可以通过将 ?wsdl 添加到上述 URL 来访问 WSDL。

重要

不要在应用程序中使用 quarkus.cxf.path = /,除非您完全确保没有其他扩展想公开 HTTP 端点。

quarkus-cxf 2.0.0 (即 {project-name} 3.0.0 之前)之前,quarkus.cxf.path 的默认值为 /。默认已被修改,因为它阻止其他 Quarkus 扩展公开任何其他 HTTP 端点。另一些是 RESTEasy、Vert.x、smallRye Health (无健康端点公开)受到此问题的影响。

注意

Quarkus-cxf 支持公开 SOAP 端点的替代方法。如需更多详细信息,请参阅 quarkus-cxf 用户指南中的 SOAP 服务章节。

2.27.3.5. 请求和响应记录

您可以为带有 org.apache.cxf.ext.logging.LoggingFeature 的客户端和服务器启用 SOAP 消息的详细日志记录:

import org.apache.camel.builder.RouteBuilder;
import org.apache.cxf.ext.logging.LoggingFeature;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.SessionScoped;
import jakarta.enterprise.inject.Produces;
import jakarta.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;
    }
}
Copy to Clipboard Toggle word wrap
注意

org.apache.cxf.ext.logging.LoggingFeature 的支持由 io.quarkiverse.cxf:quarkus-cxf-rt-features-logging 作为 camel-quarkus-cxf-soap 依赖项提供。您不需要将其显式添加到应用程序中。

2.27.3.6. WS 规格

支持的 WS 规格的扩展由 Quarkus CXF 项目提供。

camel-quarkus-cxf-soap 只能通过 io.quarkiverse.cxf:quarkus-cxf 扩展涵盖以下规格:

  • JAX-WS
  • JAXB
  • WS-Addressing
  • WS-Policy
  • MTOM

如果您的应用程序需要其他 WS 规格,如 WS-Security 或 WS-Trust,您必须添加额外的 Quarkus CXF 依赖项。请参阅 Quarkus CXF Reference 页面,以查看 Quarkus CXF 扩展涵盖哪些 WS 规格。

提示

{project-name} 和 Quarkus CXF 都包含多个集成测试,可作为实施各种 WS 规格的应用程序的可执行示例。https://github.com/apache/camel-quarkus/tree/3.15.x/integration-test-groups/cxf-soap https://github.com/quarkiverse/quarkus-cxf/tree/{quarkus-cxf-version}/integration-tests

2.27.3.7. 工具

quarkus-cxf 包装以下两个 CXF 工具:

重要

要使 wsdl2Java 正常工作,您的应用程序需要直接依赖于 io.quarkiverse.cxf:quarkus-cxf

提示

虽然不支持 wsdlvalidator,但您可以使用带有 application.properties 中的以下配置的 wsdl2Java 来验证 WSDLs:

application.properties

quarkus.cxf.codegen.wsdl2java.additional-params = -validate
Copy to Clipboard Toggle word wrap

2.27.4. 其他 Camel Quarkus 配置

Expand
配置属性类型default

quarkus.camel.cxf.class-generation.exclude-patterns

要使 CXF 服务接口正常工作,需要构建时生成一些辅助类(如请求和响应打包程序)。Camel Quarkus 允许 quarkus-cxf 扩展为类路径中找到的所有服务接口执行此操作,但此属性中的模式除外。

因为 https://issues.apache.org/jira/browse/CXF-8834,默认排除 org.apache.cxf.ws.security.sts.provider.SecurityTokenService

字符串列表

org.apache.cxf.ws.security.sts.provider.SecurityTokenService

在构建时修复的配置属性。所有其他配置属性可在运行时覆盖。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat