2012-11-04 20 views
10

Tôi muốn định cấu hình ứng dụng khách JAX-WS của mình để gửi tin nhắn trong ISO-8859-1. Hiện tại UTF-8 được sử dụng.Làm cách nào để thiết lập ứng dụng khách JAX-WS sử dụng ISO-8859-1 thay vì UTF-8?

Dưới đây là những gì khách hàng cố gắng để làm:

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

Nhưng thiết lập này được bỏ qua và tcpmon cho thấy sau được nhận bởi máy chủ:

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

Vì vậy, các thiết lập được overriden và UTF-8 được sử dụng, cả trong tiêu đề HTTP và trong thông báo XML. Dịch vụ được định nghĩa bởi WSDL được mã hóa bằng UTF-8.

Q: Tôi có nên xác định lại dịch vụ WSDL được mã hóa theo ISO-8899-1 và sau đó tạo lại ứng dụng khách không? Hoặc, là nó mà tôi chỉ không thiết lập các tiêu đề HTTP đúng cách?

+0

Khách hàng/phiên bản JDK nào khách hàng sử dụng? Tôi có thể nhớ một lỗi trong một triển khai JAX-WS cũ (1.6.0.1 hoặc hơn) ... – home

+1

Máy khách đang chạy Java 1.6.0_29, thư viện JAX-WS được sử dụng là Weblogic "Oracle JAX-WS 2.1.5". Tôi vừa thử nghiệm JAXWS đi kèm với JDK 6, "JAX-WS RI 2.1.6" và kết quả là giống nhau –

Trả lời

7

Sử dụng xử lý:

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

Và đăng ký xử lý:

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

Câu trả lời từ jaypi có vẻ đúng. Nhưng tôi cần thêm một số triển khai mặc định. Ngoài ra, thật dễ dàng để đặt nội tuyến:

CẬP NHẬT: Tôi đoán bạn phải đặt handlerChỉ rõ ràng. thay đổi kết quả của getHandlerChain sẽ không làm gì cả.

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); 
Các vấn đề liên quan