1

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

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

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

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

我至少见过一个基于代码的 JAXB 示例,它设置了 marshaller 属性,但看不到如何以声明方式执行此操作。

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

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

4

1 回答 1

1

使用SOAPHandlerhandlerchain在 web 服务中指定。

@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()以获取肥皂信封并根据需要设置前缀。

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");
于 2018-02-19T10:09:55.290 回答