2012-11-04 3 views
10

Ich möchte meinen JAX-WS-Client zum Senden von Nachrichten in ISO-8859-1 konfigurieren. Derzeit wird UTF-8 verwendet. HierHowto Setup JAX-WS-Client für die Verwendung von ISO-8859-1 anstelle von UTF-8?

ist, was der Kunde versucht zu tun:

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); 

Aber diese Einstellung ignoriert und tcpmon zeigt, dass die folgenden vom Server empfangen wird:

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/">... 

So ist die Einstellung außer Kraft gesetzt wird und UTF-8 wird sowohl im HTTP-Header als auch in der XML-Nachricht verwendet. Der Dienst wird von der WSDL definiert, die in UTF-8 codiert ist.

F: Sollte ich den Dienst WSDL neu definieren, um in ISO-8899-1 kodiert zu werden, und den Client dann neu generieren? Oder stelle ich die HTTP-Header einfach nicht richtig ein?

+0

Welcher JDK-Anbieter/welche Version wird vom Client verwendet? Ich erinnere mich an einen Fehler in einer früheren JAX-WS-Implementierung (1.6.0.1 oder so) ... – home

+1

Der Client läuft mit Java 1.6.0_29, die verwendete JAX-WS-Bibliothek ist Weblogic "Oracle JAX-WS 2.1.5". Ich habe gerade die JAXWS getestet, die mit JDK 6 geliefert wird, die "JAX-WS RI 2.1.6", und die Ergebnisse sind die gleichen –

Antwort

7

Mit Handler:

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; 
} 

und registrieren den Handler:

BindingProvider bindProv = (BindingProvider) service; 
    List<Handler> handlerChain = bindProv.getBinding().getHandlerChain(); 
    handlerChain.add(new MyMessageHandler()); 
3

Die Antwort von jaypi scheint recht. Aber ich musste einige Standardimplementierungen hinzufügen. Auch war es einfach inline zu setzen:

UPDATE: Ich denke, Sie müssen die HandlerChain explizit festlegen. Das Ändern des Ergebnisses von getHandlerChain wird nichts bewirken.

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); 
Verwandte Themen