Hi all,
I've got a client application using jersey-client 2.19 that uses a
MessageBodyWriter to write SOAPMessage entities to the HTTP request:
@Provider @Produces({SOAPConstants.SOAP_1_1_CONTENT_TYPE, SOAPConstants.SOAP_1_2_CONTENT_TYPE})
public static class SoapMessageBodyWriterimplements MessageBodyWriter<SOAPMessage> {
@Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return SOAPMessage.class.isAssignableFrom(type); }
@Override public long getSize(SOAPMessage soapMessage, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return -1; // return value is ignored since JAX-RS 2.0 }
@Override public void writeTo(SOAPMessage soapMessage, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
throws IOException, WebApplicationException {
@SuppressWarnings("unchecked")
final Iterator<MimeHeader> headers = soapMessage.getMimeHeaders().getAllHeaders(); while (headers.hasNext()) {
final MimeHeader hdr = headers.next(); if (!hdr.getName().equals(HttpHeaders.CONTENT_LENGTH)) {
httpHeaders.add(hdr.getName(), hdr.getValue()); System.out.println(hdr.getName() +": " + hdr.getValue()); }
}
try {
soapMessage.writeTo(entityStream); }catch (SOAPException se) {
throw new IOException("failed to write SOAP message to stream", se); }
}
}
At the same time I have registered a LoggingFilter so that I can see all
HTTP traffic in my log file:
final java.util.logging.Logger traceLogger =
java.util.logging.Logger.getLogger(WebClientSoapClient.class.getPackage().getName()); final LoggingFilter filter =new LoggingFilter(traceLogger, tracePayload); config.register(filter);
However, it looks like the LoggingFilter is not logging all the request
headers:
The System.out.println statement inside my MessageBodyWriter
implementation prints:
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: "http://..."
Content-Type: text/xml; charset=utf-8
But I only see the following output from the LoggingFilter:
Jan 17, 2016 2:39:26 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Sending client request on thread main
1 > POST http://.....
1 > Content-Type: text/xml
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"
Any idea what's happening here? Perhaps LoggingFilter (well,
ClientRequestContext) is not holding the latest updated version of
MultivaluedMap<String, Object> httpHeaders?
Maarten