2013-06-26 14 views
28

मेरे पास वसंत आरईएसटी जैक्सन/जेएसओएन और सबकुछ काम करता है।जैक्सन का उपयोग कर वसंत आरईएसटी - 400 खराब अनुरोध लॉगिंग

लेकिन मुझे जानबूझकर संदेश की संरचना में एक त्रुटि प्रस्तुत की जिसके परिणामस्वरूप 400 - खराब अनुरोध हुआ। लेकिन सर्वर पर कोई लॉग आउटपुट नहीं था। जिस त्रुटि की मैं अपेक्षा करता हूं वह "जैक्सन अज्ञात संपत्ति अपवाद" जैसा कुछ होगा या जो कुछ भी पकड़ा गया था और क्लाइंट को 400 त्रुटि भेजी गई थी, लेकिन सर्वर पर अपवाद का कोई लॉग नहीं था।

मैं सर्वर पर सबकुछ स्पष्ट रूप से डीबग नहीं करना चाहता, लेकिन मुझे स्प्रिंग नेटवर्क स्तर के अपवादों को स्पष्ट रूप से त्रुटि के रूप में लेबल करना चाहते हैं।

इसे चालू करने का सही तरीका क्या है?

धन्यवाद!

उत्तर

34
@ExceptionHandler 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public void handle(HttpMessageNotReadableException e) { 
    logger.warn("Returning HTTP 400 Bad Request", e); 
} 
+0

निश्चित रूप से इस के लिए एक अधिक सामान्य दृष्टिकोण है? मैं कल्पना करता हूं कि वसंत ढांचे जो इन अपवादों को फेंक देते हैं, उन्हें अपवाद फेंकने से पहले एक लॉग कॉल होगा। –

+3

वसंत उन्हें DEBUG स्तर पर लॉग इन करता है जहां तक ​​मुझे याद है। ध्यान दें कि आप इस अपवाद हैंडलर विधि को सुपरक्लास में रख सकते हैं। इसके अलावा यदि आप कभी भी क्लाइंट को त्रुटि संदेशों को वापस करना चाहते हैं (स्टेटस कोड के अतिरिक्त), तो यह तरीका है। – Jukka

+1

एक और विकल्प आपके स्वयं के अपवाद हैंडलररोलॉल्वर को अधिक "सामान्य" स्तर पर लॉगिंग करने के लिए लागू करना होगा। Http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – Jukka

26

@ जुक्का के जवाब पर बिल्डिंग, आप @ControllerAdvice (स्प्रिंग 3.2 में पेश किया) का उपयोग कर सभी नियंत्रकों के लिए विश्व स्तर पर इस सक्षम कर सकते हैं। इसके लिए आपके अंत में थोड़ा कोड की आवश्यकता होती है, लेकिन मेरे अनुभव में आप आमतौर पर वैश्विक त्रुटि प्रबंधन कॉन्फ़िगरेशन की आवश्यकता होती है और इससे आपको ब्रेकपॉइंट्स सेट करने/आसानी से समस्याओं का निरीक्षण करने की अनुमति मिलती है।

इस का एक उदाहरण नीचे है:

@ControllerAdvice 
public class ControllerConfig { 

    @ExceptionHandler 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public void handle(HttpMessageNotReadableException e) { 
     log.warn("Returning HTTP 400 Bad Request", e); 
     throw e; 
    } 
} 
+6

बहुत उपयोगी। लेकिन स्प्रिंग द्वारा स्कैन किए गए पैकेज के अंदर अपने कंट्रोलर एडवाइस को रखना सुनिश्चित करें: मेरा पहला प्रयास विफल रहा क्योंकि मैंने इसे एक सामान्य दृष्टिकोण के रूप में रखा - एक दूसरे में, मेरे नियंत्रक से अधिक सामान्य पैकेज और इसलिए इसे स्प्रिंग द्वारा ध्यान नहीं दिया गया है। – Torgeist

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