Spring重试不起作用并获得maxAttemptsExpression值的异常

时间:2018-01-17 20:00:50

标签: java spring-mvc websphere websphere-portal spring-retry

我正在使用spring-retry-1.2.0.RELEASE.jar并在服务方法

中使用以下Retryable注释
@Retryable(value = {CustomException.class}, 
            maxAttemptsExpression = "#{'${max.retry.attempts}'}", 
            backoff = @Backoff(delayExpression = "#{'${retry.delay}'}"))

在我们使用maxAttemptsExpression时,由于Interger.ParseInt/Interger.ValueOf值导致以下异常导致异常和相同错误。

  

org.springframework.expression.spel.SpelEvaluationException:   EL1001E:(pos 0):类型转换问题,无法转换   java.lang.String到java.lang.Integer

我只在少数@Retryable服务方法上看到这个例外,剩下的@Retryable方法工作正常。我不知道这里发生了什么,我们在点击注释之前也看到了值

2 个答案:

答案 0 :(得分:0)

删除#{''}(包括单引号)。

@Retryable(maxAttemptsExpression = "${max.retry.attempts}")

此处不需要#{...}

您还应该升级到1.2.1.RELEASE。

修改

其他一切必须继续;这两种形式对我来说都很好......

@SpringBootApplication
@EnableRetry
public class So48309090Application {

    public static void main(String[] args) {
        SpringApplication.run(So48309090Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(Foo foo) {
        return args -> {
            try {
                foo.foo();
            }
            catch (RuntimeException e) {

            }
            try {
                foo.bar();
            }
            catch (RuntimeException e) {

            }
        };
    }

    @Component
    public static class Foo {

        @Retryable(maxAttemptsExpression = "${max.attempts}")
        public void foo() {
            System.out.println("foo");
            throw new RuntimeException("c");
        }

        @Retryable(maxAttemptsExpression = "#{'${max.attempts}'}")
        public void bar() {
            System.out.println("bar");
            throw new RuntimeException("c");
        }

    }

}

application.properties

max.attempts=5

foo
foo
foo
foo
foo
bar
bar
bar
bar
bar

答案 1 :(得分:0)

EL1001E也是找不到该属性时引发的错误。尝试使用@Value将属性绑定到实例变量,并检查是否从属性中正确读取了该值。