SpringWS如何记录没有base64数据的MTOM消息

问题描述 投票:0回答:1

我使用SpringWS(SaajSoapMessage)SOAPMessage.writeTo(OutputStream)记录原始xml消息。问题在于它还会记录base64。我该如何解决。

[另一个问题,这似乎不是运输mtom服装的方式。我很困惑

    public WSResponse extractData(WebServiceMessage message) throws IOException,
            TransformerException {
//      SoapHeader soapHeader = ((SoapMessage)message).getSoapHeader();
//      Iterator<SoapHeaderElement> it = soapHeader.examineHeaderElements(qName);
//      SoapHeaderElement header = it.hasNext() ?it.next() : null;
//      WSResponse wsresponse = new WSResponse();
//      JAXBElement<CommonResponseBody> response = (JAXBElement<CommonResponseBody>)
//              customizeUnmarshaller.unmarshal(message.getPayloadSource());
//      JAXBElement<WSResponseHeader> responseHeader = 
//               (JAXBElement<WSResponseHeader>) customizeUnmarshaller.unmarshal(header.getSource());
//      wsresponse.setResponseHeader(responseHeader.getValue());
//      wsresponse.setResponseBody(response.getValue());

        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        message.writeTo(baos);
        String temp = baos.toString();
        String toReturn = "";

ResponseBody

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"ResponseBody", "Status", "file"})
public class CommonResponseBody {
    private String ResponseBody;
    private String Status;
    private DataHandler file;

    public String getResponseBody() {
        return ResponseBody;
    }
    public void setResponseBody(String requestBody) {
        ResponseBody = requestBody;
    }
    public String getStatus() {
        return Status;
    }
    public void setStatus(String status) {
        Status = status;
    }
    public DataHandler getFile() {
        return file;
    }
    public void setFile(DataHandler file) {
        this.file = file;
    }       
}

conf

    <!-- ws 客户端 -->

    <bean id="saajSoapMessageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
          <property name="soapVersion">
                <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11"/>
            </property>
    </bean>

    <bean id="completeJaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="packagesToScan" value="com.bytedusk.dev.ws.client.complete.model"></property>
        <property name="mtomEnabled" value="true"></property>
    </bean>

    <bean id="completeWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
        <constructor-arg ref="saajSoapMessageFactory"></constructor-arg>
        <property name="marshaller" ref="completeJaxb2Marshaller"></property>
        <property name="unmarshaller" ref="completeJaxb2Marshaller"></property>
        <property name="messageSender">
            <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender"></bean>
        </property>
        <property name="defaultUri" value="http://localhost:8080/spring-demo-web/ws/getRegistInfo"> </property>     
    </bean> 

wireshark发出的消息

    <SOAP-ENV:Envelope
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Header>
            <ns3:ResponseHeader
                xmlns:ns3="http://ws.dev.bytedusk.com/">
                <SvrTime>
                    20200520 10:29:17:716
                    </SvrTime>
                <LogId>
                    1589941757716
                    </LogId>
                </ns3:ResponseHeader>
            </SOAP-ENV:Header>
        <SOAP-ENV:Body>
            <ns3:getRegistInfoResponse
                xmlns:ns3="http://ws.dev.bytedusk.com/">
                <ResponseBody>
                    server response @20200520 10:29:17:716
                    </ResponseBody>
                <Status>
                    server status
                    </Status>
                <file>
                     [truncated]/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAEXAlgDAS
                    </file>
                </ns3:getRegistInfoResponse>
            </SOAP-ENV:Body>
        </SOAP-ENV:Envelope>

我找到了serval解决方案,但它们对我不起作用

https://stackoverflow.com/a/28719885/9628318

// Get the Envelope Source 
Source src = message.getSOAPPart().getContent() ;

// Transform the Source into a StreamResult to get the XML
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "no");
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(src, result);
String xmlString = result.getWriter().toString();

[尝试这个时,我更改为AxiomMessage,也无法使用

在不内联优化二进制数据的情况下记录MTOM消息

http://ws.apache.org/axiom/quickstart-samples.html

private void logMessage1(SOAPEnvelope env) throws XMLStreamException {
    StringWriter sw = new StringWriter();
    XMLStreamWriter writer = StAXUtils.createXMLStreamWriter(sw);
    XMLStreamWriter encoder = new XOPEncodingStreamWriter(writer,
            ContentIDGenerator.DEFAULT, OptimizationPolicy.DEFAULT);
    env.serialize(encoder);
    log.info("Message: " + sw.toString());
}
logging spring-ws mtom
1个回答
0
投票

最后!!,我发现我用错误的方式使用了编组器。

    public void doWithMessage(WebServiceMessage message) throws IOException,
            TransformerException {      
            SoapHeader soapHeader = ((SoapMessage)message).getSoapHeader();
            SoapBody soapBody = ((SoapMessage)message).getSoapBody();
        com.bytedusk.dev.ws.client.complete.model.ObjectFactory objectFactory = 
                new com.bytedusk.dev.ws.client.complete.model.ObjectFactory();
        JAXBElement<WSRequestHeader> headers =
                objectFactory.createWSRequestHeader((WSRequestHeader) header);
        new com.bytedusk.dev.ws.client.complete.model.ObjectFactory();
        JAXBElement<CommonRequestBody> bodys =
                objectFactory.createCommonRequestBody((CommonRequestBody) body);
            try {

                marshaller.marshal(headers, soapHeader.getResult());
                marshaller.marshal(bodys, soapBody.getPayloadResult());
 }

当前方式

    public void doWithMessage(WebServiceMessage message) throws IOException,
            TransformerException {      
            SoapHeader soapHeader = ((SoapMessage)message).getSoapHeader();
            SoapBody soapBody = ((SoapMessage)message).getSoapBody();
        com.bytedusk.dev.ws.client.complete.model.ObjectFactory objectFactory = 
                new com.bytedusk.dev.ws.client.complete.model.ObjectFactory();
        JAXBElement<WSRequestHeader> headers =
                objectFactory.createWSRequestHeader((WSRequestHeader) header);
        new com.bytedusk.dev.ws.client.complete.model.ObjectFactory();
        JAXBElement<CommonRequestBody> bodys =
                objectFactory.createCommonRequestBody((CommonRequestBody) body);
            try {

                marshaller.marshal(headers, soapHeader.getResult());
                MarshallingUtils.marshal(marshaller, bodys, message);
    }

注意,它们调用了不同的编组方法

    @Override
    public void marshal(Object graph, Result result) throws XmlMappingException {
        marshal(graph, result, null);
    }

    @Override
    public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException {
        try {
            Marshaller marshaller = createMarshaller();
            if (this.mtomEnabled && mimeContainer != null) {
                marshaller.setAttachmentMarshaller(new Jaxb2AttachmentMarshaller(mimeContainer));
            }
            if (StaxUtils.isStaxResult(result)) {
                marshalStaxResult(marshaller, graph, result);
            }
            else {
                marshaller.marshal(graph, result);
            }
        }
        catch (JAXBException ex) {
            throw convertJaxbException(ex);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.