2016-04-10 8 views
3

JAX-WS API(SOAPサービス)を使用したWebサービスがあります。エンコーディングWebサービス

import javax.jws.WebService; 

@WebService 
public class Accounts { 
    public String getFullName(String userID){ 
     AccountManager GFN = new AccountManager(); 
     return GFN.getFullName(userID); 
    } 

エンコードを「UTF-8」(英語以外の文字)に変更するにはどうすればよいですか? "@Produces(" text/html; charset = UTF-8 ")のようなものですが、JAX-WS(安らかなWebサービス)のためのものです。おかげさまで

答えて

1

開始するには、できるだけ早くSOAPメッセージを保持する必要があります。開始する最も良い場所は、javax.xml.ws.handler.LogicalHandler(より一般的なタイプのハンドラではなく、SOAPHandler)です。

LogicalHandlerSOAPHandler前に、SOAPペイロードを傍受し、それがこのハンドラ内でこの

を行うための理想的な場所です、あなたはエンコーディングが問題になるずっと前に、あなたがメッセージで好きに自由を持っています。あなたのコードは、この

public class YourHandler implements LogicalHandler{ 

    public boolean handleMessage(LogicalMessageContext context) { 
    boolean inboundProperty= (boolean)context.get(MessageContext.MESSAGE_INBOUND_PROPERTY); 

     if (inboundProperty) { 
       LogicalMessage lm = context.getMessage(); 
       Source payload = lm.getPayload(); 
       Source recodedPayload = modifyEncoding(payload); //This is where you change the encoding. We'll talk more about this 
       lm.setPayload(recodedPayload) //remember to stuff the payload back in there, otherwise your change will not be registered 
     } 

    return true; 
    } 

} 

だから今、あなたがメッセージを持っているようになるはずです。エンコーディングの変更を処理する方法は難しいかもしれませんが、完全にあなた次第です。

メッセージ全体にエンコードを設定するか、興味のあるフィールドに移動して()ナビゲートして、それを操作することができます。これらの2つのオプションについても、両方を達成するためのいくつかの方法があります。私は怠惰なルートを行くつもりです:ペイロード全体にエンコーディングを設定します。

 private Source modifyEncoding(Source payload){ 
     StringWriter sw = new StringWriter(); 
     StreamSource newSource = null;  
      try { 
        TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
        Transformer transformer = transformerFactory.newTransformer(); 
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //this determines the outcome of the transformation 
        StreamResult output = new StreamResult(sw); 
        transformer.transform(source, output); 
        StringReader sReader = new StringReader(sw.toString()); 
        newSource = new StreamSource(sReader);//Stuff the re-encoded xml back in a Source 
      } catch(Exception e){ 
       ex.printStackTrace(); 
      } 
     return newSource; 
    } 

LogicalHandlerした後、あなたが今SOAPHandlerを持っています。ここで、エンコーディングの設定はより簡単ですが、その動作は実装に依存します。 SOAPHandlerは次のようになります。

public class YourSOAPHandler implements SOAPHandler{ 

     public boolean handleMessage(SOAPMessageContext msgCtxt){ 
     boolean inbound = (boolean)msgCtxt.get(MessageContext.MESSAGE_INBOUND_PROPERTY); 

      if (inbound){ 
      SOAPMessage msg = msgCtxt.getMessage(); 
      msg.setProperty(javax.xml.soap.SOAPMessage.CHARACTER_SET_ENCODING,"UTF-8"); 

      msgCtxt.Message(msg); //always put the message back where you found it. 
      } 
     }  
    return true; 
    }