Ashish Mishra
Ashish Mishra

Reputation: 169

How to set custom response header in CXF-RS Camel?

Currently I'm struggling to set one custom header in CXF-RS endpoint in camel. I wanted to set one header with name 'apps-client'. This response header will be used by the consumer of the rest endpoint.

I did try by adding DefaultCxfRsBinding class.

<camel:route id="cxf-restful-routes">
    <camel:from uri="cxfrs:bean:cxf.restful.endpoint?binding=#CXFRestfulBindings" />
    <camel:to uri="direct:postJson" />
</camel:route>

Is there any other way to set response header?

Appreciate for your help..!!

Upvotes: 1

Views: 1506

Answers (2)

Ashish Mishra
Ashish Mishra

Reputation: 169

I'm able to set custom header in final response. I did via adding outInterceptor in CXFEndpoint. I have added AbstractPhaseInterceptor. First I have to set the header in CamelExchange in the camel route. Than I set the same to CXFExchange in #CXFRestfulBindings.populateCxfRsResponseFromExchange() by reading it from CamelExchange. Now, this header will be available in CXFExchange and one easily get it. I read this header in one of the interceptor which I have created by extending AbstractPhaseInterceptor. Than I have added this header in PROTOCOL_HEADERS map.

Following is the code snippet,

public class OutResponseInterceptor extends AbstractPhaseInterceptor<Message>{

    public RestResponseInterceptor(String phase) {
        super(Phase.MARSHAL);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        try {
            @SuppressWarnings("unchecked")
            MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);

            if (headers == null) {
                headers = new MetadataMap<String, Object>();
            }

            headers.putSingle("apps-client", (String) message.getExchange().get("apps-client"));
            message.put(Message.PROTOCOL_HEADERS, headers);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Thank you..!!

Upvotes: 3

Alessandro Da Rugna
Alessandro Da Rugna

Reputation: 4695

Did you try to add this header to the Exchange? The endpoint will add it to the HTTP response.

<camel:route id="cxf-restful-routes">
    <camel:from uri="cxfrs:bean:cxf.restful.endpoint?binding=#CXFRestfulBindings" />
    <camel:setHeader headerName="apps-client">
        <constant>Your value here</constant> <!-- or use <simple> language -->
    </camel:setHeader>
    <camel:to uri="direct:postJson" />
</camel:route>

Upvotes: 0

Related Questions