Suppose we have a managed CDI bean exposing to JSF-EL two methods:
public void methodA(){
//do some additional stuff
methodB();
}
@Transactional
public void methodB(){
//do actual work by several EJB calls
}
At a first glance you could think:
- If we call
methodA
(from a JSF view) we would get a transaction started and all work will be done inside this transaction
- If we call
methodA
we will get the same result for whatever methodA
is doing
Well, while the first assumption works as stated the second is, surprise, wrong. Each individual call to the mentioned EJB will trigger it's own transaction.
This behaviour is due to the following not obvious at first glance fact: JSF will call CDI methods through a proxy that wraps the actual instance and fires interceptors; in our second case interceptors have been already fired before methodA
was actually called and no other interceptors (that would trigger transaction management) will be called due to the fact that instance not proxy methodB
will be called.
U3VwcG9zZSB3ZSBoYXZlIGEgbWFuYWdlZCBDREkgYmVhbiBleHBvc2luZyB0byBKU0YtRUwgdHdvIG1ldGhvZHM6DQoNCmBgYGphdmENCnB1YmxpYyB2b2lkIG1ldGhvZEEoKXsNCgkvL2RvIHNvbWUgYWRkaXRpb25hbCBzdHVmZg0KCW1ldGhvZEIoKTsNCn0NCkBUcmFuc2FjdGlvbmFsDQpwdWJsaWMgdm9pZCBtZXRob2RCKCl7DQoJLy9kbyBhY3R1YWwgd29yayBieSBzZXZlcmFsIEVKQiBjYWxscw0KfQ0KYGBgDQpBdCBhIGZpcnN0IGdsYW5jZSB5b3UgY291bGQgdGhpbms6DQoqIElmIHdlIGNhbGwgYG1ldGhvZEFgKGZyb20gYSBKU0YgdmlldykgIHdlIHdvdWxkIGdldCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQgYW5kIGFsbCB3b3JrIHdpbGwgYmUgZG9uZSBpbnNpZGUgdGhpcyB0cmFuc2FjdGlvbg0KKiBJZiB3ZSBjYWxsIGBtZXRob2RBYCB3ZSB3aWxsIGdldCB0aGUgc2FtZSByZXN1bHQgZm9yIHdoYXRldmVyIGBtZXRob2RBYCBpcyBkb2luZw0KDQpXZWxsLCB3aGlsZSB0aGUgZmlyc3QgYXNzdW1wdGlvbiB3b3JrcyBhcyBzdGF0ZWQgdGhlIHNlY29uZCBpcywgc3VycHJpc2UsIHdyb25nLiBFYWNoIGluZGl2aWR1YWwgY2FsbCB0byB0aGUgbWVudGlvbmVkIEVKQiB3aWxsIHRyaWdnZXIgaXQncyBvd24gdHJhbnNhY3Rpb24uDQogDQpUaGlzIGJlaGF2aW91ciBpcyBkdWUgdG8gdGhlIGZvbGxvd2luZyBub3Qgb2J2aW91cyBhdCBmaXJzdCBnbGFuY2UgZmFjdDogSlNGIHdpbGwgY2FsbCBDREkgbWV0aG9kcyB0aHJvdWdoIGEgcHJveHkgdGhhdCB3cmFwcyB0aGUgYWN0dWFsIGluc3RhbmNlIGFuZCBmaXJlcyBpbnRlcmNlcHRvcnM7IGluIG91ciBzZWNvbmQgY2FzZSBpbnRlcmNlcHRvcnMgaGF2ZSBiZWVuIGFscmVhZHkgZmlyZWQgYmVmb3JlIGBtZXRob2RBYCB3YXMgYWN0dWFsbHkgY2FsbGVkIGFuZCBubyBvdGhlciBpbnRlcmNlcHRvcnMgKHRoYXQgd291bGQgdHJpZ2dlciB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50KSB3aWxsIGJlIGNhbGxlZCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpbnN0YW5jZSBub3QgcHJveHkgYG1ldGhvZEJgIHdpbGwgYmUgY2FsbGVkLg==
No comments :
Post a Comment