为什么在休息模板引发异常时未调用自定义的休息错误处理程序?

时间:2019-04-12 12:54:48

标签: spring-boot resttemplate custom-error-handling

我正在尝试覆盖我的类中的所有其余模板调用,以进行异常处理。在Spring Boot应用程序中使用带有错误处理程序的Custom异常处理。

为此,我在config中创建了一个rest模板bean,并将其中的错误处理程序设置为使用扩展DefaultResponseErrorHandler创建的自定义错误处理程序类。

public class BaseConfig {
@Bean
    @Primary
    RestTemplate restTemplate(@Autowired RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder.errorHandler(new IPSRestErrorHandler()).build();
    }
}
@Component
public class IPSRestErrorHandler extends DefaultResponseErrorHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(IPSRestErrorHandler.class);

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        if (response.getStatusCode()
                .series() == HttpStatus.Series.SERVER_ERROR) {
            LOGGER.error("Server error with exception code  : "+response.getStatusCode()+" with message : "+response.getStatusText());
            throw ExceptionUtils.newRunTimeException("Server error with exception code  : "+response.getStatusCode()+" with message : "+response.getStatusText());
        } else if (response.getStatusCode()
                .series() == HttpStatus.Series.CLIENT_ERROR) {
            LOGGER.error("Client error with exception code  : "+response.getStatusCode()+" with message : "+response.getStatusText());
            throw ExceptionUtils.newRunTimeException("Client error with exception code  : "+response.getStatusCode()+" with message : "+response.getStatusText());
        } else {
            LOGGER.error("Unknown HttpStatusCode with exception code  : "+response.getStatusCode()+" with message : "+response.getStatusText());
            throw ExceptionUtils.newRunTimeException("Unknown HttpStatusCode with exception code  : "+response.getStatusCode()+" with message :"+response.getStatusText());
        }
    }
}
public class ServicingPlatformSteps {

 @Autowired
    private RestTemplate restTemplate;

 private ResponseEntity callServicingPlatformAPI(RemittanceV2Input inputClass) {
ResponseEntity entity = null;
entity = restTemplate.exchange(builder.build().encode().toUri(),
                    org.springframework.http.HttpMethod.POST, httpEntity, typeRef);
return entity;
}

在这里,我期望当调用restTemplate.exchange方法并引发某些异常时,应该调用我的IPSRestErrorHandler。但是错误处理程序没有被调用。当我得到带有错误处理程序信息的restTemplate实例时。

您能帮我为什么不调用错误处理程序吗?

2 个答案:

答案 0 :(得分:0)

根据您的情况,在下面替换

@Component
public class IPSRestErrorHandler extends DefaultResponseErrorHandler {

}

@Component
public class IPSRestErrorHandler extends ResponseErrorHandler {

}

请注意,ResponseErrorHandler将确保读取HTTP status中的response。所以我们必须extend一样。

您已经将IPSRestErrorHandler实现注入到RestTemplate实例中。

您可以阅读更多的here,它说明了如何也可以进行单元测试。

希望有帮助。

答案 1 :(得分:0)

您应该用 BaseConfig 注释 Contiguration。 另外,看看您是否有另一个配置类将 Bean 设为 RestTemplate