AOP рекомендации по методам, отличным от метода execute весеннего пакетного тасклета, который не применяется - PullRequest
0 голосов
/ 25 мая 2018

Эта проблема возникла после перехода с весны 4.1.2 на 5.0.5, пакета с пружиной на 3.0.9 до 4.0.1 и гибернации с 4.2.0 до 5.2.16. У меня есть тасклет весеннего пакета в формате -

public class MyTasklet implements Tasklet {
                    public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) {
                        a();
                    }
                    public void a(){
                    //a few hibernate calls here
                    }
        }

Теперь я хочу, чтобы границей моей транзакции гибернации был метод a () [вызывается из execute], а не метод execute ().Но когда я пытаюсь применить точечные сокращения для достижения того же, я получаю сообщение "транзакция не выполняется" .Я предоставил пример xml ниже.

В aop pointcut-вместо имени метода 'a' [то есть public * myPackage.MyTasklet.a(..)], если я использую * (то есть public * myPackage.MyTasklet.*(..)] или 'execute'[то есть public * myPackage.MyTasklet.execute(..)] код работает нормально. По некоторым техническим причинам важно иметь границу в 'a', из-за которой я не могу иметь 'execute' или любой другой метод в качестве границы.


<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
</tx:advice>

<bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory" />
</bean>
<aop:config>
        <aop:pointcut id="Op1"
            expression="execution(public * myPackage.MyTasklet.a(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="Op1" />
</aop:config>

1 Ответ

0 голосов
/ 26 мая 2018

Этот вопрос задавался здесь сотни раз.Ваш метод a() вызывается внутренне, но внутренние вызовы методов никогда не перехватываются Spring AOP, потому что в этом случае вы фактически вызываете this.a().Это не относится к динамическому прокси-серверу, используемому Spring AOP.Если бы a() был вызван извне, то есть другим компонентом, это сработало бы.Это поведение полностью документировано в руководстве Spring AOP.

Если вы хотите перехватывать внутренние вызовы методов, вы должны использовать AspectJ вместо Spring AOP.Как настроить Spring для AspectJ и LTW (время загрузки) также задокументировано в руководстве Spring.

PS: Это совершенно не связано с обновлениями вашей версии.В более старых версиях Spring и Spring Batch все было бы одинаково.Вы смешали рефакторинг (обновление версии) с функциональными изменениями , что вам никогда не следует делать.Слишком много движущихся целей для отладки.Рефакторинг означает изменение кода (или конфигурации, в данном случае) без изменения его функциональности.

...