Reputation: 12222
I'm trying to add custom HTTP header to response in Apache CXF. I need to count MD5 from content and add it as a HTTP header. I tried to use ResponseHandler or Interceptor. My last try was
@Component
public class ResponseBPAuthFilter extends AbstractOutDatabindingInterceptor {
public ResponseBPAuthFilter() {
super(Phase.MARSHAL_ENDING);
}
@Override
public void handleMessage(Message t) throws Fault {
Map headers = CastUtils.cast((Map)t.get(Message.PROTOCOL_HEADERS));
headers.put("Some-Header", Arrays.asList("test"));
}
}
but it does nothing.
Upvotes: 9
Views: 16112
Reputation: 2298
It sounds like you can accomplish this using the CXF CachedOutputStream.
public class MD5OutInterceptor extends AbstractPhaseInterceptor<Message> {
public MD5OutInterceptor () {
super(Phase.MARSHAL);
}
public final void handleMessage(Message message) {
OutputStream os = message.getContent(OutputStream.class);
if (os == null) {
return;
}
final CachedOutputStream cos = new CachedOutputStream(os);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cos.writeCacheTo(baos);
// calculate MD5
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] mdBytes = md.digest(baos);
MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);
if (headers == null) {
headers = new MetadataMap<String, Object>();
}
headers.add("MD5-Header", new String(mdBytes));
message.put(Message.PROTOCOL_HEADERS, headers);
}
}
Don't forget to configure your interceptor in the cxf configuration file:
<jaxrs:server>
<jaxrs:outInterceptors>
<ref bean="md5OutInterceptor">
</jaxrs:outInterceptors>
</jaxrs:server>
<bean id="md5OutInterceptor" class="com.whatever.MD5OutInterceptor" />
Upvotes: 6
Reputation: 4795
Try to add Response Object
as your return value where you can set Headers..
Response.ok(/* some entity */).header("CustomHeader", "CustomValue").build();
You don't need to use interceptors
Upvotes: 11
Reputation: 1
Check CustomOutInterceptor.java in folder src/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ from cxf-2.3.3 source distribution for a working demo:
import javax.ws.rs.core.MultivaluedMap;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
public class MyOutInterceptor extends AbstractPhaseInterceptor<Message> {
public MyOutInterceptor() {
super(Phase.MARSHAL);
}
public void handleMessage(Message message) throws Fault {
MultivaluedMap<String, Object> headers = new MetadataMap<String, Object>();
headers.putSingle("BookId", "123");
message.put(Message.PROTOCOL_HEADERS, headers);
}
}
I guess the code you posted as your last attempt is taken from 1. Been trying this too, could not get it to work either...
Upvotes: -1