2011-09-12 24 views
12

मैं अपने वेब एप्लिकेशन में एक्लिप्ससेंक का उपयोग कर रहा हूं, और मुझे लगता है कि यह उत्पन्न होने वाले अपवादों को आकर्षक ढंग से पकड़ने और संभालने में कठिन समय है। मैं this thread से एक जैसी समस्या प्रतीत होता हूं, लेकिन मुझे नहीं लगता कि इसे कैसे काम करना है या इसे ठीक करना है।मैं ग्रहण लिंक से बाधा उल्लंघन अपवाद कैसे प्राप्त करूं?

मेरे कोड इस तरह दिखता है:

public void persist(Category category) { 
    try { 
     utx.begin(); 
     em.persist(category); 
     utx.commit(); 
    } catch (RollbackException ex) { 
      // Log something 
    } catch (HeuristicMixedException ex) { 
      // Log something 
    } catch (HeuristicRollbackException ex) { 
      // Log something 
    } catch (SecurityException ex) { 
      // Log something 
    } catch (IllegalStateException ex) { 
      // Log something 
    } catch (NotSupportedException ex) { 
      // Log something 
    } catch (SystemException ex) { 
      // Log something 
    } 
} 

जब जारी रहती है() एक इकाई है कि एक विशिष्टता बाधा का उल्लंघन करता है के साथ कहा जाता है, मैं अपवाद पकड़ लिया और कंटेनर से लॉग इन कर रहे की एक विस्फोट मिलता है।

try { 
     cc.persist(newCategory);   
    } catch (PersistenceException eee) { 
     // Never gets here 
     System.out.println("MaintCategory.doNewCateogry(): caught: " + eee); 
    } catch (DatabaseException dbe) { 
     // Never gets here neither 
     System.out.println("MaintCategory.doNewCateogry(): caught: " + dbe);    
    } 

मुझे लगता है कि DataBaseException का उपयोग कर पोर्टेबल नहीं है, लेकिन मैं कहीं शुरू करने की आवश्यकता:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): 
    org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement 
    was aborted because it would have caused a duplicate key value in a unique or 
    primary key constraint or unique index identified by 'SQL110911125638570' 
    defined on 'CATEGORY'. 
Error Code: -1 
(etc) 

मैं निम्नलिखित की कोशिश की है। अपवाद कभी पकड़े नहीं जाते हैं। कोई सुझाव?

+0

"डेटाबेस अपवाद पोर्टेबल नहीं है" का क्या अर्थ है? धन्यवाद! –

+0

@WeishiZeng डेटाबेस अपवाद वर्ग को org.eclipse द्वारा परिभाषित किया गया है, जेपीए विनिर्देश नहीं। तो यह संभवतः एक और जेपीए प्रदाता के साथ काम नहीं करेगा (या यहां तक ​​कि संकलित)। – AlanObject

उत्तर

8

ऐसा लगता है कि मुझे इस प्रश्न पर कोई और गतिविधि नहीं मिलेगी, इसलिए मैं अपना काम चारों ओर पोस्ट करूंगा और उसे छोड़ दूंगा। कई वेब खोजों में उपयोगी कुछ भी नहीं मिला है। मैंने सोचा होगा कि यह एक पाठ्यपुस्तक मामला है लेकिन मैंने पाया कि कोई भी ट्यूटोरियल इसे कवर नहीं करता है।

यह EclipseLink के साथ इस हालत में पता चला है के रूप में, अपवाद जब एसक्यूएल बाधा उल्लंघन किया जाता है तो आप पकड़ कर सकते हैं RollBackExceptionem.commit() कॉल का परिणाम है कि है। इसलिए मैं अपने इस तरह विधि जारी रहती है संशोधित किया है:

public void persist(Category category) throws EntityExistsException { 
    try { 
     utx.begin(); 
     em.persist(category); 
     utx.commit(); 
    } catch (RollbackException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
     throw new EntityExistsException(ex); 
    } catch (HeuristicMixedException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (HeuristicRollbackException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SecurityException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IllegalStateException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NotSupportedException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SystemException ex) { 
     Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

तो फोन करने वाले EntityExistsException पकड़ता और उचित कार्रवाई की जाती है। लॉग अभी भी आंतरिक अपवादों के साथ भर जाता है लेकिन इसे बाद में बंद किया जा सकता है।

मुझे लगता है कि इस EntityExistsException के इरादे का दुरुपयोग का एक सा है कि सामान्य रूप से केवल एक इकाई आईडी क्षेत्र को फिर से प्रयोग किया जाता है जब इस्तेमाल किया जाता है, लेकिन उपयोगकर्ता आवेदन यह कोई बात नहीं के प्रयोजनों के लिए ।

यदि किसी के पास बेहतर दृष्टिकोण है तो कृपया एक नया उत्तर या टिप्पणी पोस्ट करें।

+1

मुझे भी इस मुद्दे का सामना करना पड़ रहा है। मैं एसक्यूएल बाधा अपवादों को बाहर करना चाहता हूं (उदा। नाम बहुत लंबा, आईडी मौजूद है, आदि)। मेरे कोड में बाधा की जांच करने के बजाय। (जो अद्वितीय आईडी की जांच करने के लिए महंगा होगा।) –

3

ग्रहण लिंक केवल पर्यावरण पर निर्भर करता है और एंटरप्राइज़ पर कॉल करने वाले संचालन के क्रम के आधार पर रोलबैक अपवाद को फेंकना चाहिए। आपका लॉगिंग स्तर क्या है? ऐसा लगता है कि आप EclipseLink द्वारा लॉग इन अपवादों को देख रहे हैं, लेकिन केवल रोलबैक अपवाद के कारणों के रूप में फेंक दिया गया है।

आप पीयू संपत्ति के साथ अपवाद लॉगिंग बंद कर सकते हैं लेकिन नैदानिक ​​उद्देश्यों के लिए आमतौर पर EclipseLink को अपवाद लॉग करने की अनुमति देना बेहतर होता है।

+0

जैसा कि आप कहते हैं कि मैं विकास मोड के दौरान लॉगिंग रखना चाहता हूं, इसलिए यदि वे होते हैं तो मैं सिस्टमिक त्रुटियों को पकड़ सकता हूं। लेकिन वास्तविक समस्या यह है कि जब मैं ** प्रतिबद्ध() ** विधि को कॉल करता हूं तो मुझे अपवाद नहीं लग रहा है, इसलिए मैं स्क्रीन पर एक संदेश फेंक सकता हूं। – AlanObject

1

मैं वसंत बूट 1.1.9 + एक्लिप्ससेंक 2.5.2 का उपयोग कर रहा हूं। यह एकमात्र तरीका है जिसे मैं ConstraintViolationException पकड़ सकता हूं। ध्यान दें कि मेरा handleError(ConstraintViolationException) एक बहुत ही सरल कार्यान्वयन है जो इसे प्राप्त होने वाले पहले उल्लंघन को वापस देता है।

ध्यान दें कि जब मैं हाइबरनेट 4.3.7 और हाइबरनेट वैलिडेटेटर 5.1.3 पर स्विच करता हूं तो यह कोड भी आवश्यक था।

ऐसा लगता है कि मेरे दृढ़ता के लिए PersistenceExceptionTranslationPostProcessor exceptionTranslation() जोड़ना JavaConfig क्लास का कोई प्रभाव नहीं पड़ता है।


import javax.persistence.RollbackException; 
import javax.validation.ConstraintViolation; 
import javax.validation.ConstraintViolationException; 

import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.transaction.TransactionSystemException; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.ExceptionHandler; 

@ControllerAdvice 
class GlobalExceptionHandler 
{ 
    @ExceptionHandler(TransactionSystemException.class) 
    public ResponseEntity<Object> handleError(final TransactionSystemException tse) 
    { 
     if(tse.getCause() != null && tse.getCause() instanceof RollbackException) 
     { 
      final RollbackException re = (RollbackException) tse.getCause(); 

      if(re.getCause() != null && re.getCause() instanceof ConstraintViolationException) 
      { 
       return handleError((ConstraintViolationException) re.getCause()); 
      } 
     } 

     throw tse; 
    } 


    @ExceptionHandler(ConstraintViolationException.class) 
    @SuppressWarnings("unused") 
    public ResponseEntity<Object> handleError(final ConstraintViolationException cve) 
    { 
     for(final ConstraintViolation<?> v : cve.getConstraintViolations()) 
     { 
      return new ResponseEntity<Object>(new Object() 
      { 
       public String getErrorCode() 
       { 
        return "VALIDATION_ERROR"; 
       } 


       public String getMessage() 
       { 
        return v.getMessage(); 
       } 
      }, HttpStatus.BAD_REQUEST); 
     } 

     throw cve; 
    } 
} 
1

मैं इस का उपयोग करें।

if (!ejbGuardia.findByPkCompuestaSiExiste(bean.getSipreTmpGuardiaPK())) { 
    ejbGuardia.persist(bean); 
    showMessage(ConstantesUtil.MENSAJE_RESPUESTA_CORRECTA, SEVERITY_INFO); 
} else { 
    showMessage("Excel : El registro ya existe. (" + bean.toString() + ") ", SEVERITY_ERROR); 
} 

और ऊपर से मेरी समारोह:

public boolean findByPkCompuestaSiExiste(Object clasePkHija) throws ClassNotFoundException { 
    if (null != em.find(this.clazz, clasePkHija)) { 
     return true; 
    } 
    return false; 
} 
मैं एक मान्यता प्रत्येक जारी रहती है, तो मेरी डीएओ वर्ग में अपनी आम कार्यक्रम की जरूरत है न कि साथ

+0

जो कुछ भी आप कर रहे हैं, स्पेनिश आदमी में कोड न करें :- डी (हमेशा अंग्रेजी ..) – eav

1

संपादित अपने persistence.xml निम्नलिखित संपत्ति जोड़ने:

संपत्ति नाम = "eclipselink.exception-हैंडलर" मान = "your.own.package.path.YourOwnExceptionHandler"

अब वर्ग YourOwnExceptionHandler बनाने (सही पैकेज पर)। इसे org.eclipse.persistence.exceptions.ExceptionHandler को लागू करने की आवश्यकता है।

एक गैर तर्क निर्माता और आवश्यक विधि हैंडल अपवाद (...) बनाएँ।

इस विधि के अंदर, आप अपवादों को पकड़ सकते हैं!

+0

वाह जो 6 साल की पुरानी समस्या का एक अद्भुत अद्भुत जवाब है। यह सामान्य ज्ञान की तरह प्रतीत नहीं होता है। जब मैं उस परियोजना को फिर से खोलूं तो मैं कोशिश करूंगा। – AlanObject

+0

एलन, मैं डेटाबेस अपवाद और त्रुटि कोड पकड़ने में सक्षम था। हालांकि, मैं अभी भी अपने जेएसएफ पेज पर एक अनुकूलित संदेश भेजने की कोशिश कर रहा हूं। –