问题会生成信封特殊字符

时间:2017-09-27 17:21:01

标签: java soap

我必须从字符串创建一个SOAPMessage。

我的问题是该字符串包含特殊字符,并在尝试生成信封时出错。

我必须使用特殊字符创建信封。

我只使用java 1.7的类,我需要使用代码的类,我不能使用其他类型的信封。

这是我的代码

public class Main {
  public static void main(String[] args) {
    try {
        //We have a envelope with special characters
        String input = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header/><soapenv:Body xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"><car:Input xmlns:car=\"http://soap.sctinst.redsys.es/consumed/CARGAENTIDADES\"><list><obj><name>José Televisión</name></obj></list></car:Input></soapenv:Body></soapenv:Envelope>";
        MimeHeaders headers = new MimeHeaders();
        headers.setHeader("Content-Type", "text/xml");
        headers.setHeader("Encoding", "UTF-8");

        ByteArrayInputStream bis = new ByteArrayInputStream(input.getBytes("UTF-8"));
        int n = bis.available();
        byte[] bytes = new byte[n];
        bis.read(bytes, 0, n);

        //I specify the encoding 
        String s = new String(bytes, StandardCharsets.UTF_8);

        InputStream is = new ByteArrayInputStream(s.getBytes());

        //Create a new SOAPMessage 
        SOAPMessage message = MessageFactory.newInstance().createMessage(headers, is);

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        message.writeTo(out);
        out.toString();
        //print the envelope and the especial characters are corrects
        System.out.println(out.toString());
        SOAPPart soapPart = message.getSOAPPart();

        //FAIL THIS LINE 
        //com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
        //GRAVE: SAAJ0511: Unable to create envelope from given source
        SOAPEnvelope soapEnvelope = soapPart.getEnvelope();


        SOAPHeader soapHeader = soapEnvelope.getHeader();
        SOAPBody soapBody = soapEnvelope.getBody();
        Source source = soapPart.getContent();
        //.... continue the code    
    } catch (SOAPException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

由于

1 个答案:

答案 0 :(得分:0)

根据XML标准,有3个字符必须是XML编码的。请看看这里的答案: xml-or-php-or-someone-is-eating-my-characters

BTW:如果有可能存在二进制数据,那么它也必须被编码。作为Base64,十六进制或其他任何方式。

UPD:你在说什么特别的角色? 你的例子没有任何一个,它工作正常。 请在您的例外情况的“引起:”部分发布消息。

SAAJ0511: Unable to create envelope from given source是一条热门消息,没有任何用处。