deltaspike-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Thomas Fr├╝hbeck <fruehb...@aon.at>
Subject Re: Exception "Transaction not active" inside my own interceptor combined with @Transactional
Date Sun, 20 Sep 2015 17:40:16 GMT
Hi Greg,

AFAIK Interceptor and CDI Bean (which is not @ManagedBean) are 
orthogonal concepts, I would not mix them into one - even if it 
occasionally worked

@Transactional is an interceptor binding on its own, AFAIK there is no 
interceptor of interceptors, so a interceptor binding annotation on an 
interceptor - other than qualifying the interceptor itself - is meaningless.
So adding the interceptor binding annotation @Transactional to an 
interceptor - if ever - would make it responsible to _handle_ the 
interception - in this case: provide the transaction, right?

Injection into an interceptor is ok, so it should work in your case too, 
if the sequence (order in beans.xml?) of interceptors allows the 
@Transactional interceptor to be invoked before.
There are several possible ways to define order of interceptors, one of 
them is beans.xml

You can easily see the order of interceptors in stack trace if setting a 
breakpoint into the intercepted method.

Thomas

Am 19.09.2015 um 19:35 schrieb Grzesiek:
> Hi Gerhard, thanks for answering. Nice to see that somebody cares.
>
> your code isn't valid with cdi.
> I'm surprised. Why? Could you give me a reason?
>
> I've tried both of your hints also. But still no luck.
>
> ... just create a cdi-stereotype annotation (e.g. @Service) and annotate
>> that one with both interceptor-annotations.
>>
> // btw. to be honest, I've already created this stereotype annotation,
> exactly with name "@Service" ;-)
>
>
> I guess my whole problem is about the order of the interceptors. My custom
> *@DetectIntegrityConstraintViolation* is processed first, before
> *@Transactional* - thus exception during execution of the former
> interceptor. If yes how to solve this? Any other clues?
>
> Greg
>
>
> 2015-09-19 18:16 GMT+02:00 Gerhard Petracek <gpetracek@apache.org>:
>
>> hi greg,
>>
>> you are very welcome to ask questions on this list.
>> (helping deltaspike-users is the main intention here...)
>>
>> @your issue:
>> your code isn't valid with cdi. if you don't like to use both
>> interceptor-annotations in your service-classes, just create a
>> cdi-stereotype annotation (e.g. @Service) and annotate that one with both
>> interceptor-annotations.
>>
>> regards,
>> gerhard
>>
>>
>>
>> 2015-09-19 17:56 GMT+02:00 Grzesiek <gregory.d3@gmail.com>:
>>
>>> Hi all,
>>>
>>> It is my first post here, usually I would use StackOverflow, but there is
>>> almost none questions/ answers tagged with DeltaSpike.
>>>
>>> Sorry for wasting your precious time. But I'm struggling for a couple of
>>> hours with not working @Transactional interceptor from
>>> *deltaspike-jpa-module* inside my own interceptor.
>>>
>>> Details:
>>> My own interceptor: @DetectIntegrityConstraintViolationInterceptor needs
>> to
>>> have injected an EntityManager instance, but unfortunately I'm always
>>> getting "*java.lang.IllegalStateException: Transaction not active*"
>> inside
>>> this interceptor (injection of EntityManager works fine, but transaction
>> is
>>> not started automatically).
>>>
>>> Do somebody know why?
>>>
>>> My use case is quite simple: one service, marked with @Transactional, and
>>> its one method is also annotated with
>>> @DetectIntegrityConstraintViolationInterceptor.
>>>
>>> I've been trying blindly a couple of combinations, but none works:
>>>    * I've marked also my interceptor with @Transactional
>>>    * I've marked also both my Interceptor and InterceptorBinding with
>>> @Transactional
>>>
>>> Simplified code:
>>>
>>> @ManagedBean // make it a CDI bean
>>>> @Interceptor
>>>> @DetectIntegrityConstraintViolation
>>>> public class DetectIntegrityConstraintViolationInterceptor {
>>>>
>>>>      @Inject
>>>>      private EntityManager em;
>>>>
>>>>      @AroundInvoke
>>>>
>>>      // @Transactional     // ALSO BLINDLY TRIED THIS, but no luck
>>>      public Object processInvocation(InvocationContext ctx)
>>>>              throws Exception {
>>>>          Object o = null;
>>>>          try {
>>>>              o = ctx.proceed();
>>>>              em.flush();          // THIS CAUSES EXCEPTION, AS
>> TRANSACTION
>>>> DOESN'T EXIST
>>>>          } catch (PersistenceException ex) {
>>>>              // ....
>>>>          }
>>>>          return o;
>>>>      }
>>>>
>>> }
>>> Service class looks like:
>>>
>>> import org.apache.deltaspike.jpa.api.transaction.Transactional;
>>> @Transactional
>>>> public class MyServiceBean implements MyService {
>>>>
>>>>      @Inject
>>>>      EntityManager em;
>>>>
>>>>      @DetectIntegrityConstraintViolation
>>>>      public ResponseEntity<User> createUser(User user) {
>>>>          em.persist(user);
>>>>      }
>>>> }
>>>>
>>> Tip: EntityManager was tried both: @TransactionScoped and @RequestScoped
>> -
>>> result similar, only message was a bit different ;-)
>>>
>>> Any clues?
>>> Ps. I'm sorry, if above code is not readable, bu I don't know how to
>> format
>>> code inside an email.
>>>
>>> Libs versions used:
>>>   * deltaspike-jpa-module-api 1.4.1
>>>   * weld-servlet-core  2.2.0.Final
>>>   * JDK 1.7
>>>
>>> Kind regards
>>> Greg Demecki
>>>


Mime
View raw message