2010-07-02 6 views
9

Я пытаюсь добавить собственный HTTP-заголовок для ответа в Apache CXF. Мне нужно подсчитать MD5 из контента и добавить его как HTTP-заголовок. Я попытался использовать ResponseHandler или Interceptor. Моя последняя попытка былаКак добавить собственный HTTP-заголовок в ответ JAX-RS?

@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")); 

    } 

} 

но он ничего не делает.

ответ

11

Попробуйте добавить Response Object в качестве возвращаемого значения, где вы можете установить заголовки ..

Response.ok(/* some entity */).header("CustomHeader", "CustomValue").build(); 

Вам не нужно использовать перехватчики

-1

Проверить CustomOutInterceptor.java в папке SRC/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ от cxf-2.3.3 источник распределения для рабочей демонстрации:

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

Я предполагаю, что код, который вы отправили в качестве последней попытки, взято из 1. Пробовал это тоже, не мог заставить его работать ...

6

Похоже, вы можете выполнить это, используя 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); 
    } 
} 

Не забудьте настроить перехватчик в CxF конфигурационном файле:

<jaxrs:server> 
    <jaxrs:outInterceptors> 
     <ref bean="md5OutInterceptor"> 
    </jaxrs:outInterceptors> 
</jaxrs:server> 

<bean id="md5OutInterceptor" class="com.whatever.MD5OutInterceptor" /> 

 Смежные вопросы

  • Нет связанных вопросов^_^