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

WSDL 对 Camel 和 CXF 的响应

巫马化
2023-03-14

虽然我已经与他们互动多年,但我对WSDL设计非常陌生。我有一个 WSDL,我正在尝试与 Camel 一起使用

我试图实现的是对SOAP客户端的自定义响应字符串,并将SOAP请求转换为JSON,并将其推送到websocketsendpoint。

我的WSDL模式在代码生成时生成响应类,但是响应似乎从来没有在调试器中被调用过。

此外,如果我删除Camel中的json转换器,整个soap请求将返回给SOAP客户端,如果我将转换器留在里面,它会变得不高兴,因为它期待的是XML,而它得到的是json blob。

 <cxf:cxfEndpoint id="position-ws"
                 address="/positions"
                 endpointName="c:PositionsPort"
                 serviceName="c:PositionsService"
                 serviceClass="com.company.finance.positions.PositionsImpl"
                 xmlns:c="http://positions.finance.company.com/">
    <cxf:properties>
        <entry key="schema-validation-enabled" value="true"></entry>
    </cxf:properties>
                 </cxf:cxfEndpoint>

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <dataFormats>
        <xmljson id="xmljson"/>
        <xmljson id="xmljsonWithOptions" forceTopLevelObject="true" trimSpaces="true" rootName="newRoot" skipNamespaces="true"
                 removeNamespacePrefixes="true" expandableProperties="d e"/>
    </dataFormats>

    <route>
        <from uri="cxf:bean:position-ws?dataFormat=PAYLOAD"/>
        <convertBodyTo type="String"></convertBodyTo>
        <to uri="log:com.mycompany.order?level=DEBUG"/>
        <process ref="xmlTransformProcessor"/>
        <to uri="log:com.mycompany.order?level=DEBUG"/>
        <to uri="websocket:positionsTopic?sendToAll=true"/>

    </route>
</camelContext>

<bean id="xmlTransformProcessor" class="com.company.finance.positions.XMLTransformer"/>

XML到Json转换器

public class XMLTransformer implements Processor {

public void process(Exchange exchange) throws Exception {

    String data = exchange.getIn().getBody(String.class);


    JSONObject jsonObj = XML.toJSONObject(data);
    String json = jsonObj.toString();

    // use regular java code to transform to a better form
    //exchange.getIn().setBody(json);
    exchange.getOut().setBody(json);
}

}

所以我的问题是,使用Camel,我如何返回自定义响应字符串“Okay”、“Not Okay”等,同时将其余数据推到路线的另一步?

谢谢

共有1个答案

周宏伯
2023-03-14

谜团解开了。

我需要这样的东西:

 <route>
        <from uri="cxf:bean:position-ws"/>
        <to uri="log:com.mycompany.order?level=DEBUG"/>
        <convertBodyTo type="com.company.finance.positions.PositionSummary"/>
        <marshal>
        <jaxb contextPath="com.meteoriteconsulting.finance.positions"
        partClass="com.company.finance.positions.NewEntry"
        fragment="true"
        partNamespace="{http://com.company}NewEntry" />
        </marshal>
        <process ref="xmlTransformProcessor"/>
        <to uri="log:com.mycompany.order?level=DEBUG"/>
        <to uri="websocket:positionsTopic?sendToAll=true"/>
        <transform>
            <constant>OK</constant>
        </transform>

    </route>
 类似资料:
  • 我在做一些关于Camel-CXf集成的研究,对下面的场景感到困惑。 所以我实现了一个Restendpoint 实现如下 } 路线 将其路由到实现中。但是由于实现返回一个响应对象,我不知道如何绕过这个对象构建路由。 一旦调用进入实现,我如何执行其他路由并发送回响应?在这种情况下,实现返回一个自定义对象。 其他路由如何附加到 CXF 路由? 我的 CXF 实现是否应该始终返回无效类型?如我所见,要访问

  • 我正在使用Apache Camel CXF集成SOAP WebService。一切正常,但我注意到我的响应返回为HTTP 202而不是200。我有点担心,因为我知道很多人对之类的东西进行硬编码,这可能会破坏当前的服务。 我曾尝试使用不同的拦截器覆盖202到200的HTTP代码,但没有成功。此外,202表示已接受,这表示请求正在处理中但尚未完成。200表示正常,表示过程已完成。这是否意味着我在路上做

  • 有几种从wsdl生成java类的方法,例如Apache CXF、JAXB和JAX-WS。 我需要一个解决方案,工作与maven和曲库文件。 我的问题是,我有两个Maven模块A和B。其中一个模块(模块A)包含逻辑类,另一个模块(模块B)包含作为资源的xsd文件。现在我想从逻辑模块(模块A)生成类,xsd文件不应该作为资源添加到此模块。 我已经创建了一个catalag。包含公共名称空间并指向mave

  • 我使用apache cxf创建了一个肥皂网络服务,当我发布我的网络服务时,我得到了一个没有复杂类型部分的WSDL,这是我的代码: 我的Interafce: 我的配置: 我的请求对象: 这是生成的WSDL: 为什么在生成的WSDL中找不到像“referenceNumber”这样的请求属性

  • 我是camel的新手,我正在尝试使用camel cxf组件创建一个soap WebService。我从骆驼的样本开始。我已经配置了一个使用cxf组件的路由,并添加了一个处理器来处理请求。我在用于处理服务的bean中收到了请求,但我无法将响应发送回客户机。提前致谢 Sysout语句被打印在控制台上,但我得到的是一个空正文的soap响应。 以下是我从浏览器访问http://localhost:9080