11

ISO-8859-1でメッセージを送信するようにJAX-WSクライアントを構成したいと思います。現在、UTF-8が使用されています。

クライアントが行おうとしていることは次のとおりです。

Map<String, Object> reqContext = ((BindingProvider) service).getRequestContext();
Map httpHeaders = new HashMap();
httpHeaders.put("Content-type",Collections.singletonList("text/xml;charset=ISO-8859-1"));
reqContext.put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders);

ただし、この設定は無視され、tcpmonは、サーバーが以下を受信したことを示します。

POST /service/helloWorld?WSDL HTTP/1.1
Content-type: text/xml;charset="utf-8"
Soapaction: "helloWorld"
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: Oracle JAX-WS 2.1.5
Host: 1.1.1.1:8001
Connection: keep-alive
Content-Length: 4135

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelopexmlns:S="http://schemas.xmlsoap.org/soap/envelope/">...  

そのため、設定は上書きされ、HTTPヘッダーとXMLメッセージの両方でUTF-8が使用されます。このサービスは、UTF-8でエンコードされたWSDLによって定義されます。

Q: ISO-8899-1でエンコードされるようにサービスWSDLを再定義してから、クライアントを再生成する必要がありますか?または、HTTPヘッダーを正しく設定していないだけですか?

4

2 に答える 2

9

ハンドラーの使用:

public class MyMessageHandler implements SOAPHandler<SOAPMessageContext> {

@Override
public boolean handleMessage(SOAPMessageContext context) {
    Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    if (outbound.booleanValue()) {
        try {
            context.getMessage().setProperty(SOAPMessage.CHARACTER_SET_ENCODING,
                            "ISO-8859-1");
        }
        catch (SOAPException e) {
            throw new RuntimeException(e);
        }
    }
    return true;
}

そして、ハンドラーを登録します。

    BindingProvider bindProv = (BindingProvider) service;
    List<Handler> handlerChain = bindProv.getBinding().getHandlerChain();
    handlerChain.add(new MyMessageHandler ());
于 2014-07-31T10:02:38.420 に答える
3

jaypiからの答えは正しいようです。しかし、いくつかのデフォルトの実装を追加する必要がありました。また、インライン化するのも簡単でした。

更新:handlerChainを明示的に設定する必要があると思います。getHandlerChainの結果を変更しても、何も起こりません。

    List<Handler> chain = bindingProvider.getBinding().getHandlerChain();
    chain.add(new SOAPHandler<SOAPMessageContext>() {
      @Override
      public boolean handleMessage(SOAPMessageContext context) {
        LOG.info("BaseService.handleMessage" + context);
        Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outbound.booleanValue()) {
          try {
            context.getMessage().setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "ISO-8859-1");
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        }
        return true;        
      }

      @Override
      public boolean handleFault(SOAPMessageContext context) {
        return true;
      }

      @Override
      public void close(MessageContext context) {
      }

      @Override
      public Set<QName> getHeaders() {
        return null;
      }      
    });
    bindingProvider.getBinding().setHandlerChain(chain);
于 2016-11-22T02:16:35.433 に答える