จะเพิ่ม HTTP Header แบบกำหนดเองในการตอบกลับ JAX-RS ได้อย่างไร

ฉันกำลังพยายามเพิ่มส่วนหัว HTTP ที่กำหนดเองเพื่อตอบกลับใน Apache CXF ฉันต้องนับ MD5 จากเนื้อหาและเพิ่มเป็นส่วนหัว HTTP ฉันพยายามใช้ ResponseHandler หรือ Interceptor ความพยายามครั้งสุดท้ายของฉันคือ

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

   }

}

แต่มันไม่ทำอะไรเลย


person Piotr Gwiazda    schedule 02.07.2010    source แหล่งที่มา


คำตอบ (3)


ลองเพิ่ม Response Object เป็นค่าส่งคืนของคุณซึ่งคุณสามารถตั้งค่าส่วนหัวได้

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

คุณไม่จำเป็นต้องใช้เครื่องสกัดกั้น

person Rajesh Kumar J    schedule 20.12.2010

ดูเหมือนว่าคุณสามารถทำได้โดยใช้ 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);
    }
}

อย่าลืมกำหนดค่า interceptor ของคุณในไฟล์กำหนดค่า cxf:

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

<bean id="md5OutInterceptor" class="com.whatever.MD5OutInterceptor" />
person superdave    schedule 07.08.2012

ตรวจสอบ 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. ลองแล้วเหมือนกันครับ ใช้งานไม่ได้เช่นกัน...

person kay73    schedule 07.03.2011