0

所以我们已经有了一个可爱的老式 PHP WS,我们必须通过 JAX-RPC 进行集成,这个 WS 提供了一些响应,如下所示:

 <return SOAP-ENC:arrayType="SOAP-ENC:Array[1]" xsi:type="SOAP-ENC:Array">
    <item SOAP-ENC:arrayType="xsd:ur-type[3]" xsi:type="SOAP-ENC:Array">
       <item xsi:type="xsd:string">...</item>
       <item xsi:type="xsd:float">...</item>
       <item xsi:type="xsd:int">...</item>
    </item>
 </return>

现在的问题是,JAX-RPC 似乎不知道ur-type

我们考虑过使用Handlerfor 对响应的 XML 进行搜索和替换,或者通过XSLTso that ur-type=>对其进行转换,anyType但我们似乎无法弄清楚如何去做。具体来说,我们可以使用什么OutputStream/StreamResult可以进行转换?

任何其他建议都非常受欢迎:)

4

1 回答 1

0

因此,如果最终我们放弃了使用 aXSLT或对 raw 进行搜索和替换的想法XML

我们SOAPBody用来操纵响应DOM并替换ur-typeanyType,一切正常。尽管如此,如果您有更好的想法,请发布。

编辑:这就是我们基本上是如何做到的。

这在您获得端口的类中,您需要在您进行搜索和替换的地方注册处理程序:

private TestSOAPPort getPort() {
    TestSOAPService service = new TestSOAPServiceImpl();
    try {
        registerResponseHandler(service);
        TestSOAPPort port = service.getTestSOAPPort();
        ((TestSOAPPortStub) port)._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, TestConstants.ENDPOINT_URL);
        return port;
    } catch (Exception e) {
        // ...
    }

    return null;
}

private void registerResponseHandler(TestSOAPService service) {
    HandlerRegistry hr = service.getHandlerRegistry();
    QName portName = new QName(TestConstants.NAMESPACE_URI, TestConstants.PORT_NAME);
    List handlerChain = hr.getHandlerChain(portName);
    HandlerInfo hi = new HandlerInfo();
    hi.setHandlerClass(TestResponseHandler.class);
    handlerChain.add(hi);
}

这就是处理程序的样子:

import javax.xml.rpc.handler.GenericHandler;

public class TestResponseHandler extends GenericHandler {
    private static final String XSD_UR_TYPE = "xsd:ur-type";
    private static final String XSD_ANY_TYPE = "xsd:anyType";
    private static final String XSD_INT_ARRAY = "xsd:int[";
    private static final String XSD_ANY_TYPE_ARRAY = "xsd:anyType[";

    @Override
    public boolean handleResponse(MessageContext context) {
        SOAPMessageContext smc = (SOAPMessageContext) context;
        SOAPMessage sm = smc.getMessage();
        try {
            SOAPBody sb = sm.getSOAPBody();
            handleNodes(sb.getElementsByTagName("problemTag"));
            sm.saveChanges();
        } catch (Exception e) {
            // ...
        }

        return super.handleResponse(context);
    }

    private void handleNodes(NodeList nodes) {
        // do your search and replace here
        if (nodes == null) {
            return;
        }
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);
            NamedNodeMap attributes = node.getAttributes();
            for (int j = 0; j < attributes.getLength(); j++) {
                Node attribute = attributes.item(j);
                if (attribute.getNodeValue().startsWith(XSD_UR_TYPE)) {
                    attribute.setNodeValue(attribute.getNodeValue().replace(XSD_UR_TYPE, XSD_ANY_TYPE));
                } else if (attribute.getNodeValue().startsWith(XSD_INT_ARRAY)) {
                    attribute.setNodeValue(attribute.getNodeValue().replace(XSD_INT_ARRAY, XSD_ANY_TYPE_ARRAY));
                }
            }
        }
    }

}
于 2011-11-03T09:41:15.073 回答