開始するには、できるだけ早くSOAPメッセージを保持する必要があります。開始する最も良い場所は、javax.xml.ws.handler.LogicalHandler
(より一般的なタイプのハンドラではなく、SOAPHandler
)です。
LogicalHandler
がSOAPHandler
前に、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;
}
}
だから今、あなたがメッセージを持っているようになるはずです。エンコーディングの変更を処理する方法は難しいかもしれませんが、完全にあなた次第です。
メッセージ全体にエンコードを設定するか、興味のあるフィールドに移動して(xpath)ナビゲートして、それを操作することができます。これらの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;
}