Java 使用spring`@Retryable`注释时未引发自定义异常

Java 使用spring`@Retryable`注释时未引发自定义异常,java,spring,spring-retry,Java,Spring,Spring Retry,我正在尝试实现重试尝试功能,同时使用spring retry处理异常。我正在使用@Retryable,如下面的代码示例所述。但我在这里面临一个奇怪的问题 当我使用此注释时,它会重试3次,这是默认值,但它不会引发自定义异常,即我为应用程序创建的MyGraphDBServiceException。相反,它会抛出ArrayIndexOutOfBoundException。当我从方法中删除该注释时,我得到了预期的MyGraphDBServiceException 如何确保即使在使用此批注时也会抛出MyG

我正在尝试实现重试尝试功能,同时使用
spring retry
处理异常。我正在使用
@Retryable
,如下面的代码示例所述。但我在这里面临一个奇怪的问题

当我使用此注释时,它会重试3次,这是默认值,但它不会引发自定义异常,即我为应用程序创建的
MyGraphDBServiceException
。相反,它会抛出
ArrayIndexOutOfBoundException
。当我从方法中删除该注释时,我得到了预期的
MyGraphDBServiceException

如何确保即使在使用此批注时也会抛出
MyGraphDBServiceException

    @Override
    @Retryable(value = {MyGraphDBServiceException.class, MyGraphDBRedisServiceException.class}, backoff = @Backoff(delay = 1000))
    public Long beginTransaction() {
        //TODO: provide custom exception handling here
        if (configs.isEmpty())
            throw new MyGraphDBServiceException(SERVICE_UNAVAILABLE_EXCEPTION);

        Long txnId = null;
        List<TransactionObject> txnList = new LinkedList<>();
        try {
            //should throw exception here which should be MyGraphDBServiceException
            txnId = txnList.get(0).getTransactionId();
            Gson gson = new Gson();
            String txnString = gson.toJson(txnList);
            redisServiceUtility.add(String.valueOf(txnId), txnString);
        } catch (Exception e) {
            //TODO: provide custom exception handling here
            log.error("[Exception] Caught in redis: {}", e.getMessage());
            throw new MyGraphDBServiceException(SERVICE_UNAVAILABLE_EXCEPTION);
        }
        return txnId;
    }
@覆盖
@可检索(值={MyGraphDBServiceException.class,MyGraphDBReserviceException.class},回退=@backoff(延迟=1000))
公众长期储蓄(){
//TODO:在此处提供自定义异常处理
if(configs.isEmpty())
抛出新的MyGraphDBServiceException(服务不可用\u异常);
长txnId=null;
List txnList=新链接列表();
试一试{
//应在此处引发异常,该异常应为MyGraphDBServiceException
txnId=txnList.get(0.getTransactionId();
Gson Gson=新的Gson();
字符串txnString=gson.toJson(txnList);
redisServiceUtility.add(String.valueOf(txnId),txnString);
}捕获(例外e){
//TODO:在此处提供自定义异常处理
log.error(“[Exception]在redis:{}”中捕获,e.getMessage());
抛出新的MyGraphDBServiceException(服务不可用\u异常);
}
返回txnId;
}

需要明确的是,当我运行相同的代码但没有
@Retryable
注释时,我确实得到了
MyGrpahDBServiceException
。因此,请不要认为我的代码应该抛出
ArrayIndexOutOfBoundException
而不是自定义异常。

你实例化了一个没有项目的列表
txnList
,你正在尝试获取(
txnList.get(0)
)第一个项目。我知道。这就是异常必须捕获的内容,这就是
txnList.get(0)
抛出异常的原因。如果不使用此注释,它会按预期抛出我的异常,但使用此注释,它不会抛出此异常。这两种情况下的场景都是一样的。您希望这一行如何
txnId=txnList.get(0).getTransactionId()
应该抛出
MyGraphDBServiceException
而不是
ArrayIndexOutOfBoundException
@CodeHunter?@Deadpool,因为我正在重定向所有异常以抛出自定义的异常。顺便说一句,这是正常的工作方式。它只是带有注释,但不起作用。只是说清楚,当我运行相同的代码但没有
@Retryable
注释时,我确实得到了
MyGrpahDBServiceException
。因此,请不要认为我的代码应该抛出
ArrayIndexOutOfBoundException
而不是自定义异常。你实例化了一个没有项目的列表
txnList
,你正在尝试获取(
txnList.get(0)
)第一个项目。我知道。这就是异常必须捕获的内容,这就是
txnList.get(0)
抛出异常的原因。如果不使用此注释,它会按预期抛出我的异常,但使用此注释,它不会抛出此异常。这两种情况下的场景都是一样的。您希望这一行如何
txnId=txnList.get(0).getTransactionId()
应该抛出
MyGraphDBServiceException
而不是
ArrayIndexOutOfBoundException
@CodeHunter?@Deadpool,因为我正在重定向所有异常以抛出自定义的异常。顺便说一句,这是正常的工作方式。它只是带有注释,但不起作用。只是说清楚,当我运行相同的代码但没有
@Retryable
注释时,我确实得到了
MyGrpahDBServiceException
。所以请不要认为我的代码应该抛出
ArrayIndexOutOfBoundException
,而不是自定义异常。