为什么突然春天问我facej?

时间:2017-07-02 22:51:01

标签: java spring transactions aop aspectj

我目前正在为我的项目使用spring security。 添加此bean(用户记住我的功能)后:

    <b:bean id="jdbcTokenRepository" class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl">
        <b:property name="createTableOnStartup" value="false"/>
        <b:property name="dataSource" ref="dataSource"/>
    </b:bean>

用户令牌仍未保存。所有因为&#39; dataSource&#39;配置为autoCommit = false。

所以我做的第一件事就是(真的很难看,因为我不得不再创建一个类,但它确实有效):

 import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
 import org.springframework.transaction.annotation.Transactional;

 @Transactional
 public class TransactionalJdbcTokenRepositoryImpl extends JdbcTokenRepositoryImpl {}

对我来说,更好的解决方案如下:

    <b:bean id="jdbcTokenRepository"
                class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl">
        <b:property name="createTableOnStartup" value="false"/>
        <b:property name="dataSource" ref="dataSource"/>
    </b:bean>

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

    <aop:config proxy-target-class="false" expose-proxy="false">
        <aop:advisor id="tokenRepoAdvisor"
                             advice-ref="tokenRepoAdvice"
                             pointcut="bean(jdbcTokenRepository)"/>
    </aop:config>

纯XML没有不必要的类:

但由于某种原因,春天现在需要aspectj!

Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
... 68 more

为什么呢?没有这个配置,我的dao层在@Transactional注释下运行得很好。如何避免添加aspectj库但仍保留xml config?

1 个答案:

答案 0 :(得分:0)

重读spring文档后,我找到了一个解决方案:

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

    <bean id="jdbcTokenRepository"
            class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces" alue="org.springframework.security.web.authentication.rememberme.PersistentTokenRepository"/>
        <property name="target">
            <bean class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl">
                <property name="createTableOnStartup" value="false"/>
                <property name="dataSource" ref="dataSource"/>
            </bean>
        </property>
        <property name="interceptorNames">
            <list>
                <value>tokenRepoAdvice</value>
            </list>
        </property>
</bean>

最初的问题是JdbcTokenRepositoryImpl的父类(它有最终方法 - 这就是为什么需要aspectj)