当前位置: 首页 > 知识库问答 >
问题:

当dataFormat为message或CXF\u message时,在Apache Camel中创建SOAP消息

苏鸿卓
2023-03-14

我想通过Apache Camel调用Web服务,数据格式是MESSAGE。我想构造以下SOAP消息:

<soapenv:Envelope`enter code here`
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header>
        <platformMsgs:documentInfo
            xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
            <platformMsgs:nsId>WEBSERVICES_3479023</platformMsgs:nsId>
        </platformMsgs:documentInfo>
    </soapenv:Header>
    <soapenv:Body>
        <addListResponse
            xmlns="">
            <platformMsgs:writeResponseList
                xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
                <platformCore:status isSuccess="true"
                    xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
                    <platformMsgs:writeResponse>
                        <platformCore:status isSuccess="false"
                            xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com">
                            <platformCore:statusDetail type="ERROR">
                                <platformCore:code>DUP_ENTITY</platformCore:code>
                                <platformCore:message>This entity already exists.</platformCore:message>
                            </platformCore:statusDetail>
                        </platformCore:status>
                    </platformMsgs:writeResponse>
                </platformMsgs:writeResponseList>
            </addListResponse>`enter code here`
        </soapenv:Body>
    </soapenv:Envelope>

有人能帮我介绍一些代码片段或示例来说明如何创建此SOAP消息吗?

共有1个答案

令狐跃
2023-03-14

我可以为您提供一些关于如何在Spring DSL中使用CXF POJO格式的想法。

Spring上下文可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<spring:beans xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel-cxf="http://camel.apache.org/schema/cxf"
xmlns:camel-spring="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd       
   http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
   http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

<!-- inbound Service endpoint -->

<camel-cxf:cxfEndpoint id="my-test-endpoint"
    address="/myTest" serviceName="mySrv:MyService"
    serviceClass="com.foo.myservice.MyServicePortPortType"
    endpointName="mySrv:MyServicePortPort"
    wsdlURL="classpath:myTest.wsdl"
    xmlns:mySrv="http://foo.com/myService/">
    <camel-cxf:properties>
        <spring:entry key="dataFormat" value="POJO" />
        ...
    </camel-cxf:properties>
</camel-cxf:cxfEndpoint>
...
<camel-spring:camelContext id="MyTestService_Ctx">
...
<camel-spring:route id="myTest-route">
   <camel-spring:from uri="cxf:bean:my-test-endpoint"
            id="inbound-myTest-service" />
   ...

很简单:

>

  • 在Spring中,您将cxfendpoint定义为{http://camel.apache.org/schema/cxf}cxfEndpointbean,

    然后通过uri从Camel-route-from或to-components对其进行引用,uri如下所示:uri=“cxf:bean:{endpointbean-id}”

    那么您可能有两个案例:案例1。WSDL将标头定义为消息的一部分。Maven CXF插件生成的售后服务:

                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
    

    只需检查服务接口的外观。

    案例2:WSDL没有定义自定义头,您需要添加它。

    对于两者,请查看我对另一个问题的回答:使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头

    P、 如果出于某些原因不需要显式封送/解封送JAXB POJO,则不需要其他任何东西。您不关心SOAP等。CXF将从您的WSDL定义为您做这件事。

  •  类似资料:
    • 我正在使用apache camel cxf开发一个Web服务(肥皂),我遇到了这个错误。 Java . lang . illegalargumentexception:Part { http://blue print . camel . ngt . TN/}返回的类型应为[ltn . ngt . camel . blue print . WB _ subscriptions;,而不是org . A

    • 我在CXF(或者一般的SOAP)中遇到了这个问题。当我在服务器端和客户端同时启用MTOM请求时,我的应用程序工作得很好,Java堆大小不会成倍增长。但是,如果某些客户机决定不使用MTOM发送大的(我的意思是500MB+附件作为B64编码格式)消息,就会出现问题,这会导致Java堆大小成倍增长,当然也会发生OutOfMemoryException(OutOfMemoryException)。 那么我

    • Tomcat日志文件显示: 严重:向类org的侦听器实例发送上下文初始化事件时发生异常。springframework。网状物上下文ContextLoaderListener组织。springframework。豆。工厂BeanCreationException:创建名为“accountDetailsService”的bean时出错:调用init方法失败;嵌套异常为java。lang.NoSuch

    • 我对cxf soap头有问题。我使用Contract-firs开发方法建立了一个cxf项目。我想调用带有cxf组件的web服务,如下所示。 我想发送一个pojo消息,抛出一个直接组件作为对ws的请求。我的路线如下所示: 我需要实现这样一个soap头: 为了将其归档,我编写了一个这样的处理器(另请参见http://camel.apache.org/cxf.html): 不幸的是,我在这条语句中得到了

    • 我希望能够在cxf中每次发送soap消息时动态更改/设置ws-security信息。如何才能最好地做到这一点。 详细信息:我想更改密钥库名称、密钥库别名、密码、主机名等设置。。在运行时,最好是每次发送消息。目前我正在使用:jaxws-client和WSS4JOutInterceptor以及wss4jinterceptor进行签名。我正在使用http导管和tls客户端参数进行SSL/tls通信。ja

    • 我需要使用相同的SOAP请求才能调用相同的方法实现,但该方法由2个不同的服务endpoint公开: endpointA-将用于通过SOAP进行同步访问 endpointB-将用于通过JMS进行异步访问 现在我看到的是,在JMS和SOAP webserviceendpoint上工作的SOAP请求消息在结构上是不同的。 我想知道使用ApacheCXF是否可以使用相同的SOAP请求调用SOAP或JMSe