2012-07-03 25 views
12

one of the few questions (with answers) में मैंने जेएक्स-आरएस और कैशिंग के संबंध में एसओ पर पाया है, ईटैग (कैशिंग के लिए) उत्पन्न करने का उत्तर प्रतिक्रिया वस्तु पर कुछ मूल्य निर्धारित कर रहा है। में के रूप में निम्नलिखित:प्रतिक्रिया ऑब्जेक्ट्स का उपयोग किए बिना जेएक्स-आरएस का उपयोग करके ईटैग सेट करना संभव है?

@GET 
@Path("/person/{id}") 
public Response getPerson(@PathParam("id") String name, @Context Request request){ 
    Person person = _dao.getPerson(name); 

    if (person == null) { 
    return Response.noContent().build(); 
    } 

    EntityTag eTag = new EntityTag(person.getUUID() + "-" + person.getVersion()); 

    CacheControl cc = new CacheControl(); 
    cc.setMaxAge(600); 

    ResponseBuilder builder = request.evaluatePreconditions(person.getUpdated(), eTag); 

    if (builder == null) { 
    builder = Response.ok(person); 
    } 

    return builder.cacheControl(cc).lastModified(person.getUpdated()).build(); 
} 

समस्या यह है कि हमारे लिए काम नहीं करेगा, क्योंकि हम, दोनों सोप के लिए एक ही तरीके का इस्तेमाल करते हैं और सेवाओं REST @WebMethod (SOAP), @GET साथ तरीकों व्याख्या द्वारा (और सेवा को बेनकाब करने के लिए हमें और भी कुछ भी चाहिए)। पिछली सेवा हमें ऐसा दिखाई देगा (हेडर के निर्माण को छोड़कर):

@WebMethod 
@GET 
@Path("/person/{id}") 
public Person getPerson(@WebParam(name="id") @PathParam("id") String name){ 
    return _dao.getPerson(name); 
} 

वहाँ कोई तरीका है - कुछ अतिरिक्त विन्यास के माध्यम से - उन हेडर स्थापित करने की? यह पहली बार है जब मैंने पाया है कि प्रतिक्रिया ऑब्जेक्ट्स का उपयोग करने से वास्तव में केवल ऑटो-रूपांतरण पर कुछ लाभ होता है ...

हम अपाचे सीएक्सएफ का उपयोग कर रहे हैं।

+0

क्या मैं संभवतः किसी प्रकार का इंटरसेप्टर का उपयोग कर सकता हूं? http://stackoverflow.com/questions/3165647/apache-cxf-how-to-add-custom-http-header-to-jax-rs-response?rq=1 – oligofren

उत्तर

7

हां आप इसे प्राप्त करने के लिए इंटरसेप्टर का उपयोग करने में सक्षम हो सकते हैं यदि आप अपना प्रतिक्रिया ऑब्जेक्ट बनाने के बाद ई-टैग उत्पन्न कर सकते हैं।

public class MyInterceptor extends AbstractPhaseInterceptor<Message> { 

    public MyInterceptor() { 
     super(Phase.MARSHAL); 
    } 

    public final void handleMessage(Message message) { 
     MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS); 

     if (headers == null) { 
      headers = new MetadataMap<String, Object>(); 
     }    

     //generate E-tag here 
     String etag = getEtag(); 
     // 
     String cc = 600; 

     headers.add("E-Tag", etag); 
     headers.add("Cache-Control", cc); 
     message.put(Message.PROTOCOL_HEADERS, headers); 
    } 
} 

कि जिस तरह से व्यवहार्य नहीं है, तो मैं मूल समाधान है कि आप पोस्ट का प्रयोग करेंगे, और सिर्फ बिल्डर करने के लिए अपने व्यक्ति इकाई जोड़ें:

Person p = _dao.getPerson(name); 
return builder.entity(p).cacheControl(cc).lastModified(person.getUpdated()).build(); 
1

या उसे भेजने के रूप में सरल किया जा सकता है एक "त्रुटि" कोड वापस करें ... आप जो करना चाहते हैं उसके आधार पर।

@Path("/{id}") 
@GET 
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
public ProductSearchResultBean getProductById(@PathParam("id") Integer productId, @QueryParam("expand") List<String> expand, @Context HttpServletRequest request, @Context HttpServletResponse response) throws IOException { 

    ProductSearchResultBean productDetail = loadProductDetail(productId, expand); 

    EntityTag etag = new EntityTag(((Integer)(productDetail.toString().hashCode())).toString()); 
    String otherEtag = request.getHeader("ETag"); 
    if(etag.getValue().equals(otherEtag)){ 
     response.sendError(304, "not Modified"); 
    } 

    response.addHeader("ETag", etag.getValue()); 

    return productDetail; 
} 

इस तरह मैंने जारीकर्ता को किसी भी तरह से निपटाया। सौभाग्य! (इसके बजाए स्प्रिंग एमवीसी का उपयोग करें .... बॉक्स फ़िल्टर में से एक है जो आपके लिए सबकुछ करता है ... यहां तक ​​कि एक अच्छा इटाग भी बना रहा है :))

0

आप इसके लिए एक प्रतिक्रिया फ़िल्टर का उपयोग करने पर विचार कर सकते हैं। मैंने एक गंध लाइब्रेरी विकसित की जो आप खोज रहे हैं: https://github.com/tobilarscheid/jaxrs-etag-filter

संबंधित मुद्दे

 संबंधित मुद्दे