当前位置: 首页 > 知识库问答 >
问题:

实现ResponseErrorHandler接口

祁远
2023-03-14

我试图重写ResponseErrorHandler接口,以便能够在2xx以外的任何响应情况下返回整个请求(状态代码、正文等)。

我注意到Spring(RestTemplate)默认情况下,如果响应不是2xx会返回异常。我不想返回异常,我只想能够返回:

新建ResponseEntity(httpstatus.status_code)

@Component
public class LoginErrorHandler
        implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse httpResponse)
            throws IOException {

        return (
                httpResponse.getStatusCode().series() == CLIENT_ERROR
                        || httpResponse.getStatusCode().series() == SERVER_ERROR);
    }

    @Override
    public void handleError(ClientHttpResponse httpResponse)
            throws IOException {
        if (httpResponse.getStatusCode()
                .series() == SERVER_ERROR) {
            // handle SERVER_ERROR
        } else if (httpResponse.getStatusCode()
                .series() == CLIENT_ERROR) {
            // handle CLIENT_ERROR
        }
    }

但是我不明白如何在不更改方法返回的情况下返回ResponseEntity(我无法通过实现方法来实现)。

执行:

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new LoginErrorHandler());

return restTemplate.postForEntity(url, request, String.class);

共有1个答案

云锦
2023-03-14

您可以使用Spring的ControllerAdviseExceptionHandler注释来处理应用程序中的异常。如果在请求中遇到任何异常,下面的代码返回500 http状态代码。您可以添加其他异常类或自己的自定义类来处理特定的情况并将特定的状态代码返回给客户端。

编辑

处理每一个代码都不是一个好主意。相反,您可以将它们包装在自定义异常中,并向客户机服务提供适当的消息。不过,你可以试试下面的方法。

@Component
@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(HttpClientErrorException.BadRequest.class)
    @ResponseStatus(code=HttpStatus.BAD_REQUEST, reason="Bad Request", value=HttpStatus.BAD_REQUEST)
    public void handleBadRequest(HttpClientErrorException.BadRequest e) {

        //handle bad request exception
    }

    @ExceptionHandler(HttpClientErrorException.NotFound.class)
    @ResponseStatus(code=HttpStatus.NOT_FOUND, reason="Not Found", value=HttpStatus.NOT_FOUND)
    public void handleNotFound(HttpClientErrorException.NotFound e) {

        //handle Not Found
    }

    @ExceptionHandler(HttpServerErrorException.InternalServerError.class)
    @ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR, reason="Internal Server Error", value=HttpStatus.INTERNAL_SERVER_ERROR)
    public void handleInternalServerError(HttpServerErrorException.InternalServerError e) {

        //handle internal server error
    }

//more methods for each code.
}
@Component
public class LoginErrorHandler
        implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse httpResponse)
            throws IOException {

        return (httpResponse.getStatusCode() != HttpStatus.OK);
    }

    @Override
    public void handleError(ClientHttpResponse httpResponse)
            throws IOException {
        if (httpResponse.getRawStatusCode() >=400 && httpResponse.getRawStatusCode()<500 ) {
            throw HttpClientErrorException.create(httpResponse.getStatusCode(), httpResponse.getStatusText(), httpResponse.getHeaders(), null, null); 
        }else if(httpResponse.getRawStatusCode() >=500){
            throw HttpServerErrorException.create(httpResponse.getStatusCode(), httpResponse.getStatusText(), httpResponse.getHeaders(), null, null);
        }else {
            //throw some other exceptions for other codes and catch them in controller advice.
        }
    }
}
 类似资料:
  • 问题内容: 在JDBC中,要连接和执行DB中的语句,我们主要使用Connection,Statement和ResultSet这两个接口。但是它们对应的对象后来用于运行诸如createStatement(),executeQuery(),next()等的方法。哪个类实现了这些方法?为什么将其称为连接对象而不是已实现的类对象? 问题答案: 在JDBC中,您首先需要通过调用来注册驱动程序 加载数据库类并

  • 问题内容: 有没有为接口方法创建默认实现的首选方法或样式?假设我有一个常用的接口,在90%的情况下,我想要的功能是相同的。 我的第一个直觉是用静态方法创建一个具体的类。然后,当我想要默认功能时,可以将功能委托给静态方法。 这是一个简单的示例: 接口 方法的具体实现 使用默认功能的具体实现 这里有更好的方法吗? 编辑 在看到了一些建议的解决方案之后,我认为我应该更加清楚自己的意图。本质上,我正在尝试

  • 我需要创建一个实现接口的类吗?如果是,如何实施?有什么例子吗?或者我只是把它留空然后Spring来做这些工作? 我使用以下简单代码进行尝试: loginbean.java 但我得到 更新 好的,我发现了问题,是因为我的autowired accountRepository是空的,你知道吗?

  • 问题内容: 我已经阅读了“ C#匿名实现接口(或抽象类) ”线程以匿名实现接口。但是我想知道使用委托或任何类似方法的.NET 2.0(NO LINQ)是否也可能实现 我从JAVA知道以下可能: (我希望我还记得,是一段时间以前我使用JAVA,但我想它是类似的东西)。每当方法需要接口的实例并且仅被调用一次时,这可能会有所帮助,因此无需为此单一方法创建新的类。 问题答案: .NET 2.0还支持匿名委

  • Iam获得以下错误:-检查了lib文件夹,它是spring-beans我使用了以下名称空间:-http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/

  • 他能给我建议和解决方案。非常感谢。请帮帮我!