我目前正在为我的项目使用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?
答案 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)