What I actually want to do in the @Provides method is as follows:
@Provides
FirstService provideFirstService(SecondServiceImpl secondServiceImpl,
SomeConfig config) {
if(config.isProduction()) {
return new FirstServiceImplForProduction(secondServiceImpl);
}
return new FirstServiceImplForDevelopment();
}
And there are many client classes that expect injection of FirstService via
@Inject.
Do you mean that I should invoke conditionally
injector.getInstance(FirstServiceImplForProduction.class) or
injector.getInstance(FirstServiceImplForDevelopment.class) instead of use
@Inject in the client classes? I think it's pretty awkward... Or do you
have any better idea?
2015年11月21日土曜日 13時44分14秒 UTC+9 Vyacheslav Rusakov:
>
> Guice AOP works only on instances created by guice. You create new
> FirstServiceImpl(secondServiceImpl) manually and so guice can't apply
> transactional on it.
> So it's "by design" behaviour.
>
> Try to avoid doing guice job: let it create all instances for you.
> If you have a complex case and bean class to instantiate is known only at
> runtime, you can still use injector.getInstance(KnownJustNow.class) to ask
> guice to construct instance for you (with aop).
>
> суббота, 21 ноября 2015 г., 10:07:39 UTC+6 пользователь Kohei Nozaki
> написал:
>>
>> Hello,
>>
>> @Transactional annotation doesn't work for an instance provided by a
>> method annotated as @Provides. My situation is as follows. I have two
>> classes in the reproducer. A class named FirstServiceImpl which is depends
>> on SecondServiceImpl. These classes have following methods:
>>
>> // Method in FirstServiceImpl
>> @Transactional
>> public void firstSave(final MyEntity myEntity) {
>> secondServiceImpl.secondSave(myEntity);
>> }
>>
>> // Method in SecondServiceImpl
>> public void secondSave(final MyEntity myEntity) {
>> em.persist(myEntity);
>> }
>>
>> And FirstService is produced by a method annotated as @Provided:
>>
>> // Method in MyModule.
>> @Provides
>> FirstService provideFirstService(final SecondServiceImpl
>> secondServiceImpl) {
>> return new FirstServiceImpl(secondServiceImpl);
>> }
>>
>> In that situation, I expect transaction will begin on
>> FirstServiceImpl#firstSave() both of following two cases:
>>
>> (a) Acquire an instance by calling
>> injector.getInstance(FirstService.class)
>> (b) Acquire an instance by calling
>> injector.getInstance(FirstServiceImpl.class)
>>
>> But it doesn't work for (a). It looks like that @Transactional doesn't
>> affect for an instance produced by @Provided method. I found a workaround
>> that putting @Transactional to SecondServiceImpl#secondSave() make it work,
>> But unfortunately I can't make it for real code at my job.
>>
>> I've pushed the reproducer to GitHub:
>> https://github.com/lbtc-xxx/guice-persist-tx
>>
>> Is this behavior by design? Or are there any better workaround?
>>
>> Thanks.
>>
>
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice.
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-guice/bb5b0a8e-5fb8-4278-bef8-a8bc14160579%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.