如何在 CXF-RS Camel 中设置自定义响应 header?
How to set custom response header in CXF-RS Camel?
目前我正在努力在 camel 的 CXF-RS 端点中设置一个自定义 header。我想设置一个名称为 'apps-client' 的 header。此响应 header 将由其余端点的使用者使用。
我确实尝试过添加 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>
是否有任何其他方式来设置响应header?
感谢您的帮助..!!
您是否尝试将此 header 添加到 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>
我可以在最终回复中设置自定义 header。我通过在 CXFEndpoint 中添加 outInterceptor 来完成。我添加了 AbstractPhaseInterceptor。首先,我必须在骆驼路线的 CamelExchange 中设置 header。比起我在 #CXFRestfulBindings.populateCxfRsResponseFromExchange() 中通过从 CamelExchange 读取 CXFExchange 来设置相同的内容。现在,这个 header 将在 CXFExchange 中可用,并且很容易获得它。我在我通过扩展 AbstractPhaseInterceptor 创建的拦截器之一中读到了这个 header。比我在 PROTOCOL_HEADERS 地图中添加这个 header。
以下是代码片段,
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();
}
}
}
谢谢..!!
目前我正在努力在 camel 的 CXF-RS 端点中设置一个自定义 header。我想设置一个名称为 'apps-client' 的 header。此响应 header 将由其余端点的使用者使用。
我确实尝试过添加 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>
是否有任何其他方式来设置响应header?
感谢您的帮助..!!
您是否尝试将此 header 添加到 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>
我可以在最终回复中设置自定义 header。我通过在 CXFEndpoint 中添加 outInterceptor 来完成。我添加了 AbstractPhaseInterceptor。首先,我必须在骆驼路线的 CamelExchange 中设置 header。比起我在 #CXFRestfulBindings.populateCxfRsResponseFromExchange() 中通过从 CamelExchange 读取 CXFExchange 来设置相同的内容。现在,这个 header 将在 CXFExchange 中可用,并且很容易获得它。我在我通过扩展 AbstractPhaseInterceptor 创建的拦截器之一中读到了这个 header。比我在 PROTOCOL_HEADERS 地图中添加这个 header。
以下是代码片段,
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();
}
}
}
谢谢..!!