2014-05-13 13 views
16

पर फ़िल्टर करें, मैं ContainerRequestFilter का उपयोग करके मेरी सेवा में आने वाले अनुरोधों पर कुछ सत्यापन करने की कोशिश कर रहा हूं। सबकुछ ठीक काम कर रहा है, हालांकि एक समस्या है - प्रत्येक अनुरोध फ़िल्टर के माध्यम से गुजरता है, भले ही कुछ फ़िल्टर कभी भी लागू नहीं होंगे (एक फ़िल्टर केवल संसाधनऑन पर मान्य होता है, दूसरा संसाधन केवल दो पर)।जर्सी अनुरोध केवल कुछ यूआरआई

क्या कुछ स्थितियों के तहत अनुरोध पर केवल एक फ़िल्टर को लागू करने का कोई तरीका है?

हालांकि यह एक अवरोधक या बाधा नहीं है, यह मुझे लगता है कि आप जर्सी 2.x प्रयोग कर रहे हैं मान व्यवहार :)

उत्तर

37

इस तरह की (JAX-आरएस 2.0 एपीआई के लिए कार्यान्वयन को रोकने के लिए सक्षम होने के लिए अच्छा होगा)।

आपके पास अपना लक्ष्य प्राप्त करने के दो तरीके हैं।

1. उपयोग नाम बाइंडिंग:


1,1 @NameBinding साथ एनोटेट कस्टम टिप्पणी बनाएं:

@NameBinding 
@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AnnotationForResourceOne {} 

1,2। अपनी एनोटेशन के साथ फ़िल्टर बनाएं:

@Provider 
@PreMatching 
@AnnotationForResourceOne 
public class ResourceOneFilter implements ContainerRequestFilter { 
... 
} 

1.3। और चयनित संसाधन विधि के साथ बनाया फिल्टर बाँध:

@Path("/resources") 
public class Resources { 
    @GET 
    @Path("/resourceOne") 
    @AnnotationForResourceOne 
    public String getResourceOne() {...} 
} 

2. उपयोग DynamicFeature:


2,1। फ़िल्टर बनाएं:

public class ResourceOneFilter implements ContainerRequestFilter { 
... 
} 

2.2। javax.ws.rs.container.DynamicFeature इंटरफ़ेस को लागू:

@Provider 
public class MaxAgeFeature implements DynamicFeature { 
    public void configure(ResourceInfo ri, FeatureContext ctx) { 
     if(resourceShouldBeFiltered(ri)){ 
      ResourceOneFilter filter = new ResourceOneFilter(); 
      ctx.register(filter); 
     } 
    } 
} 

इस परिदृश्य में:

  • फिल्टर @Provider एनोटेशन के साथ एनोटेट नहीं है;
  • configure(...) प्रत्येक संसाधन विधि के लिए विधि लागू की जाती है;
  • ctx.register(filter) संसाधन विधि के साथ फ़िल्टर को बांधता है;
+0

डायनामिक फीचर एक आकर्षण की तरह काम करता था। –

+5

क्या आप निश्चित हैं कि नामबाइंडिंग उदाहरण में '@ प्रीमैचिंग 'एनोटेशन की आवश्यकता है? – Zakhar

+0

नाम बाइंडिंग मेरे लिए काम नहीं करती – Kunal

7

जब हम @NameBinding का उपयोग करते हैं तो हमें फ़िल्टर से @PreMatching एनोटेशन को हटाने की आवश्यकता होती है। @PreMatching सभी अनुरोध फ़िल्टर के माध्यम से जाते हैं।

1

@PreMatching@NameBinding के साथ मिलकर काम नहीं करता है, क्योंकि संसाधन वर्ग/विधि अभी तक पूर्व मिलान चरण में ज्ञात नहीं है। मैंने फ़िल्टर से @PreMatching को हटाकर और बाध्यकारी प्राथमिकता का उपयोग करके इस समस्या को हल किया। ResourceConfig.register(Object component, int bindingPriority) देखें।

संसाधनों से पहले निष्पादित करने के लिए फ़िल्टर को उच्च प्राथमिकता प्राप्त होती है।