2009-11-09 13 views
9

तरीके अनुरोध किया गया:
1. Struts कार्रवाई
2. सेवा वर्ग विधि (@Transactional द्वारा एनोटेट)
3. Xfire वेब सेवा कॉलजेपीए को वापस लेनदेन से कैसे रोकें?

सहित सब कुछ struts (DelegatingActionProxy) और लेन-देन वसंत के साथ कॉन्फ़िगर किया गया है।

जेपीए/हाइबरनेट के साथ दृढ़ता से किया जाता है।

कभी-कभी webservice एक अनचेक अपवाद फेंक देगा। मैं इस अपवाद को पकड़ता हूं और एक चेक अपवाद फेंक देता हूं। मैं नहीं चाहता कि लेनदेन वापस रोल करें क्योंकि वेब सेवा अपवाद वर्तमान स्थिति को बदलता है। मैं इस तरह विधि टिप्पणी किए गए:

@Transactional(noRollbackFor={XFireRuntimeException.class, Exception.class}) 
public ActionForward callWS(Order order, ....) throws Exception 
    (...) 
    OrderResult orderResult = null; 

    try { 
    orderResult = webService.order(product, user) 
    } catch (XFireRuntimeException xfireRuntimeException) { 
    order.setFailed(true); 
    throw new WebServiceOrderFailed(order); 
    } finally { 
    persist(order); 
    } 
} 

मैं अभी भी इस अपवाद: जब मैं JUnit के साथ इस पुन: पेश करने की कोशिश

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly 

, लेनदेन रोल के लिए वापस चिह्नित नहीं है और यह अभी भी संभव है लेनदेन करने के लिए।

मैं वसंत को लेनदेन को वापस न करने के लिए कैसे बना सकता हूं?

उत्तर

7

इस समस्या के लिए एक परीक्षण का मामला बनाने के लिए प्रबंधित:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"file:web/WEB-INF/spring/applicationContext.xml", 
     "file:web/WEB-INF/spring/services.xml"}) 
@Transactional 
public class DoNotRollBackTest { 
    @Autowired FakeService fakeService; 

    @Test 
    @Rollback(false) 
    public void testRunXFireException() { 
     fakeService.doSomeTransactionalStuff(); 
    } 
} 

FakeService:

@Service 
public class FakeService { 
    @Autowired private EcomService ecomService; 
    @Autowired private WebService webService; 

    @Transactional(noRollbackFor={XFireRuntimeException.class}) 
    public void doSomeTransactionalStuff() { 
     Order order = ecomService.findOrderById(459); 

     try { 
      webService.letsThrowAnException(); 
     } catch (XFireRuntimeException e) { 
      System.err.println("Caugh XFireRuntimeException:" + e.getMessage()); 
     } 

     order.setBookingType(BookingType.CAR_BOOKING); 
     ecomService.persist(order); 
    } 
} 

WebService:

@Transactional(readOnly = true) 
public class WebService { 
    public void letsThrowAnException() { 
     throw new XFireRuntimeException("test!"); 
    } 
} 

यह रोलबैक-अपवाद पुन: होगा।

तब मुझे एहसास हुआ कि लेन-देन को शायद वेबबैक.लेट्स थ्रोएएनएक्सप्शन में रोलबैक के रूप में चिह्नित किया जा रहा है क्योंकि वेब सेवा भी लेनदेनपूर्ण है। मैं एनोटेशन में स्थानांतरित हो गया:

@Transactional(noRollbackFor={XFireRuntimeException.class}) 
    public void letsThrowAnException() { 

अब लेनदेन वापस नहीं जा रहा है और मैं ऑर्डर में बदलाव कर सकता हूं।

3

आपको एक अपवाद नहीं फेंकना चाहिए जहां वसंत इसे देख सकता है। इस मामले में, आपको WebServiceOrderFailed() फेंकना नहीं चाहिए। समाधान कोड को दो तरीकों से विभाजित करना है। पहली विधि त्रुटि को संभालने और अपवाद देता है, बाहरी विधि लेनदेन बनाता है।

[संपादित करें] noRollbackFor के लिए: के साथ Exception.class को प्रतिस्थापित करने का प्रयास करें।

+1

यह गलत है। 'noRollbackFor' निर्दिष्ट अपवाद वर्ग और उसके सभी उप-वर्गों की जांच करता है: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor() इसके अतिरिक्त , डिफ़ॉल्ट रूप से चेक अपवादों से रोलबैक ट्रिगर नहीं होगा: http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#transaction-declarative-attransactional-settings – ChssPly76

+1

यह स्पष्ट नहीं करता है कि क्यों उपरोक्त कोड 'WebServiceOrderFailed' पर वापस रोल करता है। –

+0

मेरा अनुमान है कि WebServiceOrderFailed एक रनटाइम अपवाद और उपरोक्त कोड है ('noRollbackFor = {..., अपवाद।कक्षा} ') का कोई प्रभाव नहीं पड़ सकता क्योंकि अपवाद को विशेष रूप से संभाला जाता है (अन्यथा, विरासत कोड भी रनटाइम अपवाद को अनदेखा कर देगा क्योंकि यह अपवाद को बढ़ाता है)। –

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