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

使用@ExceptionHandler根据请求动态返回HTTP状态代码

琴俊人
2023-03-14

我希望根据响应对象错误动态返回HTTPStatus代码,如400、400、404等。我被提到这个问题--使用Spring3RESTful以编程方式更改http响应状态,但没有帮助。

我有一个带有@exceptionHandler方法的控制器类

@ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseEntity<?> handleException(CustomException e) {
        return new ResponseEntity<MyErrorResponse>(
                new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())), 
                ExceptionUtility.getHttpCode(e.getCode()));
    }

ExceptionUtility是一个类,其中有上面使用的两个方法(GetMessageGetCode)。

public class ExceptionUtility {
    public static String getMessage(String message) {
        return message;
    }

    public static HttpStatus getHttpCode(String code) {
        return HttpStatus.NOT_FOUND; //how to return status code dynamically here ?
    }
}

我不想签入if条件并相应地返回响应代码,有没有其他更好的方法来做到这一点?

共有1个答案

丁雅惠
2023-03-14

第一种方法:

您可以在customException类中获取HTTPStatus字段。例如。

    class CustomException {
         HttpStatus httpStatus;
         ....other fields
    }

您可以抛出如下错误:

throw new CustomException(otherField , HttpStatus.CREATED);
@ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseEntity<?> handleException(CustomException e) {
        return new ResponseEntity<MyErrorResponse>(
                new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())), 
                e.getHttpStatus());
    }
public enum ErrorCode {


    MyErrorCode(HttpStatus.OK);

    HttpStatus status;

//getter for httpstatus
}
@ExceptionHandler(CustomException.class)
        @ResponseBody
        public ResponseEntity<?> handleException(CustomException e) {
            return new ResponseEntity<MyErrorResponse>(
                    new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())), 
                    e.getHttpStatus());
        }
HttpStatus getHttpStatus(String code) {
   return ErrorCode.valueOf(code.toUpperCase()).getHttpStatus();
}

对不起,我错过了空指针异常在上面的方法,但您可以修改根据您的需要,只是给出一个想法。:)

 类似资料:
  • 问题内容: 好的,我已经到处寻找了。基本上,我们使用的是跨域请求的$ http请求。我们的服务器允许该域,当请求返回200时,一切正常。但是,无论何时我们的服务器返回错误500、401,无论如何,Angular都认为这是CORS问题。 我用Fiddler调试了响应,以验证服务器是否返回了500,但Angular阻塞了。 这是请求: 然后在控制台中,我将看到: XMLHttpRequest无法加载f

  • 我有一个springboot/openapi应用程序。不依赖Spring Security性。通过swagger启动POST请求时,返回的状态为403。请求未到达控制器类。然而,Get请求确实有效,并返回状态200。 配置如下 application.yaml 403状态的原因可能是什么? 控制器

  • 问题内容: 当JavaScript网络调用(例如fetch或XMLHttpRequest或任何其他类型的HTTP网络请求)失败且HTTP状态代码为0时,这是什么意思? 这似乎不是有效的HTTP状态代码,因为其他代码是HTTP规范中的三位数字。 我尝试将网络完全拔掉作为测试。它可能不相关,但是导致状态代码17003(IIRC),粗略搜索表明这意味着“ DNS服务器查找失败”。 相同的代码在某些位置和

  • 我正在做一个新项目,我想实现一个“等到网站打开”功能,如果http://switch-check.cf/index.php打开,然后继续。 现在,在我的帮助下。htaccess和php我尽了最大的努力。禁止访问php文件。因此,如果你试图访问我提到的网页,你应该得到一个 403拒绝访问 因此,我使用urllib(也尝试了请求)查看网站是否已打开或仍处于禁止访问状态然而,无论我尝试什么,我总是得到2

  • 嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单。 我抄了 如果我从VerifyCsrfToken检查中排除它,我的代码工作完全正常。但是我确实希望令牌验证有效。 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419。 抱歉下面的长代码,但他们在这里(我知道我没有做任何关于设置会话和东西,请忽略现在因为代码返回419状态) 路线/web.php login.j

  • 我看到了这个关于Python的问题,该问题试图对Azure DevOps REST API进行身份验证,并接收HTTP Status 203(非权威信息)。当查看文本响应时,它只是登录页面的HTML,而不是实际登录我。我使用了REST API页面上列出的,但它似乎不起作用。下面是我的代码示例: