2012-03-12 19 views
7

मैं एक AJAX- सक्षम जावास्क्रिप्ट फ्रंटएंड पर काम कर रहा हूं जो स्ट्रूट्स के साथ लिखे गए जावा बैकएंड पर कॉल करता है। मेरी समस्या यह है कि जब बैकएंड अपवाद फेंकता है, तो क्लाइंट अभी भी "500 आंतरिक सर्वर त्रुटि" की बजाय "200 ओके" HTTP प्रतिक्रिया कोड देखता है जैसा कि कोई उम्मीद करेगा।स्ट्रेट्स बनाना 500 आंतरिक सर्वर त्रुटि भेजता है जब अपवाद फेंकते हैं

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

मैं वास्तव में इन त्रुटियों को गहन तरीके से संभालने के लिए अपने क्लाइंट जेएस लाइब्रेरी हैकिंग से बचना चाहता हूं। तो फिर, बैकएंड में एक अनचाहे अपवाद होने पर स्ट्रैट्स मुझे 500 स्टेटस कोड कैसे दे सकता है? क्या यह स्ट्रूट का डिफ़ॉल्ट व्यवहार नहीं होना चाहिए?

संपादित करें: क्लाइंट-साइड कोड इस मामले में अप्रासंगिक है। मुझे सर्वर को ठीक करने की आवश्यकता है, इसलिए जब अनचाहे अपवाद होते हैं तो यह उचित स्थिति कोड भेजता है। धन्यवाद!

उत्तर

3

मैं एक तरह से यह करने के लिए पता लगा है। मुझे यकीन नहीं है कि यह सबसे अच्छा या आसान है, लेकिन यह काम करता है। मैं Struts Exception Configuration guide पाया और कहा कि मेरे लिए निम्न <package>struts.xml अंदर:

<global-results> 
    <result name="exception">/exception.jsp</result> 
</global-results> 

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

यह सब बिना क्रिया अपवाद /exception.jsp पर पुनः निर्देशित किया कारण बनता है। और यहाँ JSP की सामग्री हैं: अपवाद किसी भी अधिक लॉगिन नहीं किया जा रहा था:

<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ page contentType="application/json; charset=UTF-8" %> 
<% response.setStatus(500); %> 
{"success": false,"errors": "<s:property value="%{exception.message}"/>"} 

आप 3 लाइन है कि मैं मैन्युअल रूप से 500

यह मैं एक नई समस्या दे दी है के जवाब कोड सेट पर ध्यान दें जाएगा । नहीं इस तरह के एक सरल और स्पष्ट सुविधा डिफ़ॉल्ट बनाने के लिए -1, और एक अन्य -1: जैसा कि ऊपर उल्लिखित Struts गाइड में सुझाव दिया है, मैं इस जोड़कर struts.xml में मेरी <package> के लिए निम्न रूप में अच्छी तरह से हल:

<interceptors> 
    <interceptor-stack name="appDefaultStack"> 
     <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">ERROR</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="appDefaultStack" /> 

Struts समाधान को इतना उलझाने के लिए।

-1

आपने उल्लेख नहीं किया है कि आप किस जेएस लाइब्रेरी का उपयोग कर रहे हैं। मैं दस्तावेज सावधानीपूर्वक पढ़ने का सुझाव दूंगा। अगर इसमें किसी प्रकार की कॉलबैक विधि है, तो इसमें responseCode के अलावा कुछ होना चाहिए। सर्वर-साइड में जब भी कुछ सत्यापन अपवाद होता है, तो एक त्रुटि संदेश भी पास करें। बस कुछ अपवाद फेंकने पर भरोसा न करें, क्योंकि आप AJAX का उपयोग कर रहे हैं। आप इस संदेश के लिए सत्यापन विफल होने जैसे कुछ संदेश दिखाने के लिए responseText ट्रैक कर सकते हैं, कृपया पुनः प्रयास करें "। इस बात से सहमत ?

अन्यथा WebApplicationException फेंक से पहले प्रतिक्रिया के लिए प्रतिबद्ध है:

throw new javax.ws.rs.WebApplicationException(); // or by any other constructor 

यहाँ jar

+0

क्लाइंट-साइड लाइब्रेरी ExtJS है, लेकिन है कि कोई फर्क नहीं पड़ता। सर्वर क्या समस्या है। स्ट्रैट्स एक HTML त्रुटि रिपोर्ट और "200 ओके" स्थिति कोड भेजता है जब सर्वर पक्ष पर एक अनचाहे अपवाद होता है, और यही वह है जिसे मैं ठीक करने का प्रयास कर रहा हूं। एचटीएमएल मैं संभाल सकता हूं, लेकिन त्रुटियों के होने पर स्ट्रूट को 500 कोड भेजने में सक्षम होना चाहिए, कोड 200 नहीं। धन्यवाद! – curtisdf

+0

'WebApplicationException()' एक HTTP 500 त्रुटि कोड का कारण बनता है। क्या आपने इसे फेंकने की कोशिश की? – tusar

+0

सर्वर साइड पर मैं हर जगह ट्राई/कैच ब्लॉक सम्मिलित करने के लिए होने से बचने के लिए चाहते हैं। मुझे स्ट्रैट्स को कुछ प्रकार की कॉन्फ़िगरेशन की आवश्यकता है, "राइट थिंग (टीएम) करें और जब भी आप इन मूर्ख समस्या रिपोर्ट भेजते हैं तो मुझे 500 प्रतिक्रिया कोड दें।" – curtisdf

0

500 आंतरिक सर्वर त्रुटि सर्वर-साइड त्रुटि है, जिसका अर्थ है कि समस्या शायद आपके कंप्यूटर या इंटरनेट कनेक्शन के साथ नहीं है बल्कि इसके बजाय वेब साइट के सर्वर में कोई समस्या है।

क्लाइंट पक्ष में इसे संभालने की बात नहीं है। यह अनुरोधों को संभालने में कॉन्फ़िगर वेब सर्वर (HTTP सर्वर) पर है।

+0

-1। मुझे लगता है कि जिस तरह से मैंने अपना प्रश्न लिखा है, यह स्पष्ट है कि मैं पहले से ही समझता हूं कि 500 ​​आंतरिक सर्वर त्रुटि क्या है, साथ ही साथ क्लाइंट-सर्वर इंटरैक्शन की प्रकृति भी है। मैं स्ट्रैट्स (मेरे सर्वर पर) को जिस तरह से चाहता था, उस तरीके से व्यवहार करने के बारे में जानकारी ढूंढ रहा था। – curtisdf

2

अद्यतन: मैं <global-results> अनुभाग (जो httpheader टैग याद आ रही थी)

मैं your solution बेहतर तरह ठीक कर दी है, लेकिन यहाँ एक और तरीका है कि आप यह कर सकता है अगर आप w गड़बड़ नहीं करना चाहता था है/jsp में प्रतिक्रिया शीर्षलेख सेट करना।

  1. struts.xml में,, "अपवाद"
  2. struts.xml में नाम का एक परिणाम के लिए "java.lang.Exception" से एक वैश्विक अपवाद मानचित्रण नहीं बना एक वैश्विक परिणाम है जो एक के लिए "अपवाद" नक्शे बनाने 500 के मूल्य के साथ httpheader परिणाम।
  3. वेब.xml में, एक त्रुटि-पृष्ठ प्रविष्टि बनाएं जो आपके त्रुटि पृष्ठ स्थान पर त्रुटि कोड 500 को मानचित्र करे।

तो, struts.xml के लिए:

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

<global-results> 
    <result name="exception" type="httpheader"> 
     <param name="error">500</param> 
    </result> 
</global-results> 

और web.xml

<error-page> 
    <error-code>500</error-code> 
    <location>/exception.jsp</location> 
</error-page> 

यह काम करता है लेकिन कुछ बड़े कमियां है के लिए। सर्वलेट कंटेनर अपने त्रुटि पृष्ठ (नहीं struts) प्रतिपादन ताकि आप अभ्यस्त मूल त्रुटि संदेश या struts valueStack के लिए उपयोग किया जाता है। अपवाद लॉगिंग अभी भी काम करेगी, हालांकि (यदि आपने इसे सक्षम किया है)।

एक के रूप में अलग रूप में, मैं भी यह चौंकाने struts कि यह ऐसा कठिन बना देता है पाते हैं। हर दूसरे ढांचे में मैं एक त्रुटि पेज और एक त्रुटि कोड लागू करने के लिए बहुत मामूली बात है लौटने की अवधारणा के साथ पेश किया है।