弹簧注释不起作用

Posted

技术标签:

【中文标题】弹簧注释不起作用【英文标题】:Spring Annotations not working 【发布时间】:2011-01-02 15:35:34 【问题描述】:

我在春季论坛上发布了这个,对于 xpost 感到抱歉。

我是春天的新手。我正在开发一个使用 spring 1.2.8(旧的,我知道)和 java 1.5 的现有项目,因此注释应该可以工作。

我正在尝试在具体类上使用@Transactional 注释,遵循以下文档:http://static.springsource.org/spring/docs/1.2.8/reference/transaction.html#d0e6062

所以我有这样的事情:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="DataSource"/>
</bean>

<bean id="MyDAO"
  class="com.company.package.dao.spring.MyDAOImpl">
  <property name="dataSource" ref="DataSource" />
</bean>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
  <property name="transactionInterceptor" ref="txInterceptor"/>
</bean>

<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager" ref="transactionManager"/>
  <property name="transactionAttributeSource">
    <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
  </property>
</bean>

然后我注释我的班级:

@Transactional(propagation = Propagation.REQUIRED)
public class MyDAOImpl extends JdbcDaoSupport implements MyDAO
...

当我运行它时,我可以在调试日志中看到 spring 正在查找所有类: 代码:

01-07-10 12:10:45 DEBUG [DefaultXmlBeanDefinitionParser] Neither XML 'id' nor 'name' specified - using generated bean name [org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator]
01-07-10 12:10:45 DEBUG [DefaultXmlBeanDefinitionParser] Neither XML 'id' nor 'name' specified - using generated bean name [org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor]
01-07-10 12:10:45 DEBUG [DefaultXmlBeanDefinitionParser] Neither XML 'id' nor 'name' specified - using generated bean name [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#329f3d]

但在那之后没有提及注释或事务。我什至不知道是否应该有。我正在我的 mysql 日志中验证查询没有以事务方式执行。

有什么想法吗?

【问题讨论】:

您是否尝试过使用程序化事务管理(TransactionTemplate)?它是否产生了预期的交易行为? 我没有用 TransactionTemplate 尝试过,但我在没有注释的情况下使用 org.springframework.transaction.interceptor.TransactionProxyFactoryBean 类以声明方式完成了它。这使我可以对数据库进行事务访问,最终我想要事务访问和注释。 你如何从 MyDAOImpl 调用方法? 我使用 spring 将其注入到另一个 bean/类中,而另一个类调用该 MyDAOImpl 实例上的方法。 另一个 bean 中包含 MyDAOImpl 的字段的类型是什么:MyDAO 或 MyDAOImpl? 【参考方案1】:

我经常忽略的一件事是,代理只能拦截来自类本身外部的调用:如果您有一个方法调用同一个类中的事务方法,它将不被代理包裹。但那是注释单个方法而不是整个类的时候,所以它可能不是导致您的问题的原因。

【讨论】:

【参考方案2】:

忽略 DEBUG 行(他们只是说你没有指定 id 或 name 你只有一个 bean class="")

你放线了吗,

<tx:annotation-driven transaction-manager="transactionManager" /> 

您还需要在顶部添加 schemaLocation,例如

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
</beans>

否则注释不会得到处理:)

【讨论】:

您好,谢谢您的回复。我违背了我的意愿使用了 spring 1.2.8,但事实就是如此。我相信 tx:annotation-driven 直到春季 2.0 才引入。另外,我为 1.2.8 链接的文档没有提及它...

以上是关于弹簧注释不起作用的主要内容,如果未能解决你的问题,请参考以下文章

弹簧靴。 CORS。 'allowCredentials = false' 不起作用

为啥弹簧测试失败,不起作用@MockBean

Spring Security 角色不起作用

弹簧注解@Inject 不起作用

禁用弹簧安全不起作用[重复]

弹簧自动装配在非弹簧管理类中不起作用