2016-12-21 13 views
5

में हेडर प्राप्त करने के लिए कैसे मैं नवीनतम स्प्रिंग डेटा रेस्ट का उपयोग कर रहा हूं और मैं बनाने से पहले "" ईवेंट को संभालने में हूं। आवश्यकता मैं भी मॉडल "ग्राहक" के लिए पोस्ट अंतबिंदु को प्रस्तुत HTTP हेडर कब्जा करने के लिए है। हालांकि, के लिए इंटरफ़ेस RepositoryEventHandler इसका खुलासा नहीं करता है।स्प्रिंग डेटा रेस्ट - @RepositoryEventHandler

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 

    @Autowired 
    private ClientService clientService; 

    @HandleBeforeCreate 
    public void handleClientSave(Client client) { 
    ... 
    ... 
    } 
} 

हम घटनाओं से कैसे निपटता और HTTP हेडर पर कब्जा कर सकते हैं? मैं का उपयोग करता है @RequestHeader HttpHeaders हेडर वसंत MVC तरह पैरामीटर के लिए उपयोग करना चाहते हैं।

+0

की कोशिश की मैं परीक्षण नहीं किया है, लेकिन आप कर सकते हैं '@ Autowired'' 'HttpServletRequest सीधे' तरह @Autowired \t निजी HttpServletRequest अनुरोध; 'तो request.getHeader (" उपयोगकर्ता-एजेंट ") का उपयोग' '.can आप कृपया उदाहरण यहाँ https://www.mkyong.com जाँच/जावा/कैसे करने वाली मिलता-http-अनुरोध हेडर में जावा/ –

+0

HttpServletRequest एक स्प्रिंग प्रबंधित नहीं है सेम तो autowired नहीं किया जा सकता। –

+0

एक कस्टम नियंत्रक के बिना एक विचार एक सर्वलेट फ़िल्टर होगा जो थ्रेडलोकल का उपयोग करके मौजूदा थ्रेड को आवश्यक मानों को बांधता है और उन्हें स्थिर कॉल के माध्यम से उपलब्ध कराता है। उदाहरण के लिए देखें http://veerasundar.com/blog/2010/11/java-thread-local-how-to-use-and-code-sample/ या http://blog.smartbear.com/programming/how- और-कब-उपयोग-जावा-थ्रेडलोकल-ऑब्जेक्ट/ –

उत्तर

6

आप बस अपनी eventhandler

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 
    private HttpServletRequest request; 

    public ClientEventHandler(HttpServletRequest request) { 
     this.request = request; 
    } 

    @HandleBeforeCreate 
    public void handleClientSave(Client client) { 
     System.out.println("handling events like a pro"); 
     Enumeration<String> names = request.getHeaderNames(); 
     while (names.hasMoreElements()) 
      System.out.println(names.nextElement()); 
    } 
} 

के एक क्षेत्र के लिए अनुरोध को देखते हुए कोड मैं निर्माता इंजेक्शन, जो मुझे लगता है कि साफ है इस्तेमाल किया autowire सकते हैं, लेकिन फील्ड या सेटर इंजेक्शन बस के रूप में अच्छी तरह से काम करना चाहिए।

मैं वास्तव में stackoverflow पर समाधान नहीं मिला: Spring: how do I inject an HttpServletRequest into a request-scoped bean?

ओह, और मैं सिर्फ @Marc thecomments में इस प्रस्तावित देखा ... लेकिन मैं वास्तव में यह :)

+0

आप '@ Autowired' –

+1

जोड़ना भूल गए हैं यदि कोई एकल कन्स्ट्रक्टर –

+2

है तो कोई जरूरी नहीं है कि कोई खुद से पूछ सके (मैंने किया) यह कैसे संभव है कि इंजेक्शन' HttpServletRequest' वास्तव में वर्तमान अनुरोध का संदर्भ देता है हालांकि 'ClientEventHandler' क्लास है एक 'घटक' (और इस प्रकार एक सिंगलटन)। खैर, जब एक स्कॉप्ड बीन (उदाहरण के लिए 'HttpServletRequest' की तरह अनुरोध-स्कोप्ड) को लंबे समय तक रहने वाले दायरे (जैसे' @ घटक ') के बीन में इंजेक्शन दिया जाता है तो वास्तव में बीओएन के स्थान पर एओपी प्रॉक्सी इंजेक्शन दी जाती है। प्रॉक्सी तब मौजूदा दायरे में वास्तविक बीन उदाहरण को कॉल भेजता है। – jannis

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