CXF не реализует динамическую фильтрацию, как описано здесь: http://www.jalg.net/2012/09/declarative-cache-control-with-jax-rs-2-0
И если вы используете для возврата непосредственно свои собственные объекты, а не CXF Response, трудно добавить заголовок элемента управления кешем.
Я нахожу элегантный способ, используя пользовательскую аннотацию и создавая перехватчик CXF, который читает эту аннотацию и добавляет заголовок.
Итак, сначала создайте аннотацию CacheControl
@Target(ElementType.METHOD )
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheControl {
String value() default "no-cache";
}
Затем добавьте эту аннотацию в свой метод работы CXF (интерфейс или реализация, в которой он работает, если вы используете интерфейс)
@CacheControl("max-age=600")
public Person getPerson(String name) {
return personService.getPerson(name);
}
Затем создайте перехватчик CacheControl, который будет обрабатывать аннотацию и добавит заголовок к вашему ответу.
public class CacheInterceptor extends AbstractOutDatabindingInterceptor{
public CacheInterceptor() {
super(Phase.MARSHAL);
}
@Override
public void handleMessage(Message outMessage) throws Fault {
//search for a CacheControl annotation on the operation
OperationResourceInfo resourceInfo = outMessage.getExchange().get(OperationResourceInfo.class);
CacheControl cacheControl = null;
for (Annotation annot : resourceInfo.getOutAnnotations()) {
if(annot instanceof CacheControl) {
cacheControl = (CacheControl) annot;
break;
}
}
//fast path for no cache control
if(cacheControl == null) {
return;
}
//search for existing headers or create new ones
Map<String, List<String>> headers = (Map<String, List<String>>) outMessage.get(Message.PROTOCOL_HEADERS);
if (headers == null) {
headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
outMessage.put(Message.PROTOCOL_HEADERS, headers);
}
//add Cache-Control header
headers.put("Cache-Control", Collections.singletonList(cacheControl.value()));
}
}
Наконец, настройте CXF для использования вашего перехватчика, вы можете найти всю необходимую информацию здесь: http://cxf.apache.org/docs/interceptors.html
Надеюсь, это поможет.
Лоик