2014-10-27 3 views
0

Я звоню в веб-службу BPM, которая отправляет HTML-письмо. Я создал прокси-сервер веб-службы в JDeveloper 11.1.1.7. Тип тела письма - это xsd: строка, которая должна отображаться в строке java String. Я понимаю, что некоторые символы, например <> &, зарезервированы и преобразованы во время создания документа xml во время операции прокси.Как предотвратить <преобразование в < при использовании прокси-класса веб-службы в JDeveloper

Используя SOAPUI для вызова службы, я могу передать тело как <h1>My Heading</h1>, и служба отвечает правильно, отправив письмо с HTML как ожидалось. Выполняя то же самое с POJO, вызывающего прокси, <h1> преобразуется в &lt;h1&gt;My heading&lt;/h1&gt;.

Я пробовал передать тело как раздел CDATA, но это не имеет значения. Я попытался преобразовать тело в байты, а затем вернуться к строке UTF-8 перед вызовом, но все равно никакой разницы. У меня есть доступ к коду службы BPM. Есть ли способ, которым я могу отправить html службе из прокси-сервера, который сохраняет специальные символы?

ответ

0

Я понял это окончательно. Хотя генератор прокси-сервера веб-службы JDeveloper полезен большую часть времени, в этом случае это было не так, поскольку мне нужно было отправить специальные символы xml в службу. Возможно, есть способ манипулировать прокси-кодом, чтобы делать то, что вы хотите, но я не мог понять это.

Особой помощью был this AMIS blog entry. И если вам когда-либо понадобится обрабатывать специальные символы во время сортировки JAXB, this entry will help you too. Отличная сводка steps to use the java URLConnection class is here и ответ points to a library that would probably make life even easier.

Итак, здесь приведен код необработанной оболочки. Специальная служба электронной почты BPM, которую мы написали, также записывает в журнал и объясняет сложные типы в исходном XML-входе. Естественно, я буду заполнять значения электронной почты из переданного объекта POJO в основном методе оболочки sendMail.

package com.yourdomain.sendmail.methods; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

import java.util.List; 
import java.util.Map; 
import java.util.Scanner; 

import oracle.adf.model.connection.url.URLConnectionProxy; 
import oracle.adf.share.ADFContext; 


public class SendMailWrapper { 

public SendMailWrapper() { 
    super(); 
} 

public static void main(String[] args) throws MalformedURLException, IOException { 
    SendMailWrapper w = new SendMailWrapper(); 
    w.sendMail(); 
} 

public void sendMail() throws MalformedURLException, IOException { 
    String xmlInput = 
     "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " + 
     "xmlns:sen=\"http://xmlns.oracle.com/bpmn/bpmnProcess/SendEmailProcess\" " + 
     "xmlns:ema=\"http://www.wft.com/BPM/SendEmail/Email\">\n" + 
     "<soapenv:Header/>" + 
     "<soapenv:Body>\n" + 
     "<sen:start>\n" + 
      "<ema:emailInput>\n" + 
       "<ema:emailContent>\n" + 
        "<ema:toAddr>[email protected]</ema:toAddr>\n" + 
        "<ema:fromAddr></ema:fromAddr>\n" + 
        "<ema:ccAddr></ema:ccAddr>\n" + 
        "<ema:bccAddr></ema:bccAddr>\n" + 
        "<ema:subject>SendMail HTML</ema:subject>\n" + 
        "<ema:body><h1>My Heading</h1><p>Text</p></ema:body>\n" + 
        "<ema:contentType>text/html</ema:contentType>\n" + 
       "</ema:emailContent>\n" + 
       "<ema:emailHistory>\n" + 
        "<ema:projectName>Soap Test</ema:projectName>\n" + 
        "<ema:reqID></ema:reqID>\n" + 
        "<ema:compositeID></ema:compositeID>\n" + 
        "<ema:processID></ema:processID>\n" + 
        "<ema:processName></ema:processName>\n" + 
        "<ema:activityName></ema:activityName>\n" + 
        "<ema:insertDate></ema:insertDate>\n" + 
        "<ema:insertByID></ema:insertByID>\n" + 
        "<ema:insertByName></ema:insertByName>\n" + 
        "<ema:commentType></ema:commentType>\n" + 
        "<ema:commentInfo></ema:commentInfo>\n" + 
       "</ema:emailHistory>\n" + 
      "</ema:emailInput>\n" + 
     "</sen:start>\n" + 
     "</soapenv:Body>\n" + 
     "</soapenv:Envelope>\n"; 

    System.out.println(xmlInput); 

    String wsURL = getWsdlUrl(); 
    URL url = new URL(wsURL); 
    URLConnection connection = url.openConnection(); 
    HttpURLConnection httpConn = (HttpURLConnection)connection; 

    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[xmlInput.length()]; 
    buffer = xmlInput.getBytes(); 
    bout.write(buffer); 
    byte[] b = bout.toByteArray(); 
    String SOAPAction = "start"; //this is the method in the service 
    httpConn.setRequestProperty("Content-Length", String.valueOf(b.length)); 
    httpConn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); 

    //some other props available but don't need to be set... 
    //httpConn.setRequestProperty("Accept-Encoding", "gzip,deflate"); 
    //httpConn.setRequestProperty("Host", "your.host.com:80"); 
    //httpConn.setRequestProperty("Connection", "Keep-Alive"); 
    //httpConn.setRequestProperty("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)"); 

    httpConn.setRequestProperty("SOAPAction", SOAPAction); 
    httpConn.setRequestMethod("POST"); 
    httpConn.setDoOutput(true); 
    httpConn.setDoInput(true); 

    OutputStream out = httpConn.getOutputStream(); 
    out.write(b); 
    out.close(); 

    //check response code... 
    int status = httpConn.getResponseCode(); 
    String respMessage = httpConn.getResponseMessage(); 
    System.out.println("RESPONSE CODE: " + status + " RESPONSE MESSAGE: " + respMessage); 

    //check response headers... 
    for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) { 
     System.out.println(header.getKey() + "=" + header.getValue()); 
    } 

    //check error stream - this helps alot when debugging... 
    InputStream errorStream = ((HttpURLConnection)connection).getErrorStream(); 
    if (errorStream != null) { 
     System.out.println("Error Stream: " + convertStreamToString(errorStream)); 
    } 

    //if there was an expected response, you need to parse it... 
    /* String responseString = ""; 
    String outputString = ""; 
    InputStreamReader isr = new InputStreamReader(httpConn.getInputStream()); 
    BufferedReader in = new BufferedReader(isr); 
    while ((responseString = in.readLine()) != null) { 
     outputString = outputString + responseString; 
    } 
    isr.close(); 
    System.out.println("OUT: " + outputString); */ 
} 

static String convertStreamToString(InputStream is) { 
    Scanner s = new Scanner(is).useDelimiter("\\A"); 
    return s.hasNext() ? s.next() : ""; 
} 

private static String getWsdlUrl() { 
    String result = null; 

    try { 
     URLConnectionProxy wsConnection = (URLConnectionProxy)ADFContext.getCurrent().getConnectionsContext().lookup("SendMailProxyConnection"); 
     result = wsConnection.getURL().toExternalForm(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return result; 
} 

}

Днем кодирования.

 Смежные вопросы

  • Нет связанных вопросов^_^