【问题标题】:Generate custom namespace prefix with CXF/JAXB (WSDL-first)使用 CXF/JAXB 生成自定义命名空间前缀(WSDL 优先)
【发布时间】:2018-07-25 17:00:18
【问题描述】:

我正在将 Web 服务从 Weblogic 迁移到 JBoss。现有客户端之一使用对使用的名称空间前缀敏感的解析器,我无法影响这一点。迁移更改了一些前缀,我需要能够恢复它们。

我查看了各种选项,其中许多来自 this answer,但似乎没有一个合适。

我正在使用cxf-codegen-plugin 并从 WSDL 生成我的源代码。这似乎拒绝了我向我的来源添加注释的选项。

我也不将 Spring 与 CXF 一起使用(因为这不是 Spring 应用程序,我正在部署到本机使用 CXF 的 JBoss),所以我没有CXF documentation 中描述的选项使用jaxws:dataBinding(或者如果我有这个选项,我不明白如何配置它)。

我至少见过 one code-based JAXB example 设置了 marshaller 属性,但看不到如何以声明方式执行此操作。

我的 JAXB 调用已经涉及一个自定义 bindings.xml 用于映射 dateTime 类型(由于与现有代码相关的遗留原因),我期待类似的事情是可能的,但我一直没能去发掘它。

鉴于这些限制,是否有人知道如何做到这一点?

【问题讨论】:

标签: web-services jaxb cxf jaxb2 cxf-codegen-plugin


【解决方案1】:

使用SOAPHandler 并在网络服务中指定为handlerchain

@HandlerChain(file="/handler-chain.xml")
public class WebserviceImpl {

handler-chain.xml(在WEB-INF/classes 内)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
    <handler-chain>
        <handler>
            <handler-name>NamespacePrefixHandler</handler-name>
            <handler-class>com.my.package.CustomHandler</handler-class>
        </handler>
    </handler-chain>
</handler-chains>

实现handleMessage() 以获取soapenvelope 并根据需要设置前缀。

final SOAPMessage soapMessage = context.getMessage();
final SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
final SOAPBody soapBody = soapMessage.getSOAPBody();

soapEnvelope.setPrefix("my");
soapEnvelope.removeNamespaceDeclaration("soap");

removeNSprefix(soapBody.getChildElements());
soapBody.setPrefix("my");

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多