【问题标题】:Spring AOP Transaction - Property Based Timeout?Spring AOP 事务 - 基于属性的超时?
【发布时间】:2012-02-03 23:17:52
【问题描述】:

在处理 Spring Transactions/AOP 时,我可以使用 Spring EL 从属性文件中提取超时值并将其转换为整数吗?

这里是代码

<tx:advice id="GlobalDataTxAdvice" transaction-manager="GlobalDataTransactionManager">
    <tx:attributes>
        <tx:method name="get*" no-rollback-for="javax.persistence.NoResultException,javax.persistence.NonUniqueResultException,org.springframework.dao.EmptyResultDataAccessException"/>
        <tx:method name="find*" no-rollback-for="javax.persistence.NoResultException,javax.persistence.NonUniqueResultException,org.springframework.dao.EmptyResultDataAccessException"/>
        <tx:method name="search*" read-only="true" no-rollback-for="javax.persistence.NoResultException,javax.persistence.NonUniqueResultException,org.springframework.dao.EmptyResultDataAccessException"/>
        <tx:method name="*" timeout="${service.jta.timeout:60}"/>
    </tx:attributes>
</tx:advice>

所以我希望默认事务超时为 60 秒,或者允许从属性占位符文件中提取超时(int 值)。

但是当我部署它时,我得到:

weblogic.application.ModuleException: :org.xml.sax.SAXParseException:cvc-datatype-valid.1.2.1: '${service.jta.timeout:60}' 不是 'integer' 的有效值。

【问题讨论】:

    标签: spring spring-aop


    【解决方案1】:

    试试这个

    <util:properties id="contextProperties" location="classpath:context.properties"/>
    
    <tx:advice id="GlobalDataTxAdvice" transaction-manager="GlobalDataTransactionManager">
      <tx:attributes>
        <tx:method name="get*" no-rollback-for="javax.persistence.NoResultException,javax.persistence.NonUniqueResultException,org.springframework.dao.EmptyResultDataAccessException"/>
        <tx:method name="find*" no-rollback-for="javax.persistence.NoResultException,javax.persistence.NonUniqueResultException,org.springframework.dao.EmptyResultDataAccessException"/>
        <tx:method name="search*" read-only="true" no-rollback-for="javax.persistence.NoResultException,javax.persistence.NonUniqueResultException,org.springframework.dao.EmptyResultDataAccessException"/>
        <tx:method name="*" timeout="#{ T(Integer).valueOf(contextProperties['timeout']?: 60)}"/>
      </tx:attributes>
    </tx:advice>
    

    MoreInfo:link

    【讨论】:

    • 感谢您的帮助。在部署时我得到相同类型的错误: weblogic.application.ModuleException: :org.xml.sax.SAXParseException:cvc-datatype-valid.1.2.1: '#{ T(Integer).valueOf(contextProperties['timeout' ]?: 60)}' 不是 'integer' 的有效值。
    • 如果我再次阅读异常,看起来会发生这种情况,因为在部署 Spring Context 文件的解析必须对 Spring TX Schema 使用验证,并且 timeout 属性定义为 xs:integer 和不能是任何非数字。
    • 你使用的是 Spring 3.0+,因为 SpEL 是在 3 中引入的,你应该得到类似 SpelParseException 的东西
    猜你喜欢
    • 2018-05-23
    • 2014-08-19
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多