如何在CXF-RS Camel中设置自定义响应头?

时间:2017-05-04 17:23:10

标签: apache-camel cxfrs

目前,我很难在驼峰的CXF-RS端点设置一个自定义标头。我想设置一个名为'apps-client'的标题。此响应标头将由其余端点的使用者使用。

我尝试添加DefaultCxfRsBinding类。

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

有没有其他方法可以设置响应头?

感谢您的帮助.. !!

2 个答案:

答案 0 :(得分:1)

我能够在最终回复中设置自定义标头。我通过在CXFEndpoint中添加outInterceptor来实现。我添加了 AbstractPhaseInterceptor 。首先,我必须在camel路由中设置CamelExchange中的标头。我通过从CamelExchange中读取它,在#CXFRestfulBindings.populateCxfRsResponseFromExchange()中将其设置为CXFExchange。现在,这个标题将在CXFExchange中可用,并且很容易得到它。我通过扩展 AbstractPhaseInterceptor 在我创建的一个拦截器中读取了这个头。比我在 PROTOCOL_HEADERS 地图中添加了这个标题。

以下是代码段,

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

谢谢.. !!

答案 1 :(得分:0)

您是否尝试将此标头添加到Exchange?端点会将其添加到HTTP响应中。

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