【问题标题】:How to return a status code of 400 when path is not found找不到路径时如何返回状态码 400
【发布时间】:2019-09-03 15:42:54
【问题描述】:

我有一个 Spring Boot REST 应用程序。当路径不存在时,我需要返回 400 bad request 的状态码。考虑:

This is a good url
localhost:8080/mypath?name=test

Bad Path (return status 400)
localhost:8080/mybadpath?name=test

如何使用 Spring Boot 来做到这一点

【问题讨论】:

  • 您不应该返回 404 吗? :)
  • 哪个版本的spring boot?
  • @Deadpool 它的 spring boot 2.1.3
  • 我试过2.1.0它对我有用试试我的答案@Luke101
  • @TheLostMind 实际上,我必须这样做。选择不取决于我。

标签: java spring-boot


【解决方案1】:

这适用于 spring boot-2.1.3,通过实现 ErrorController

@Controller
public class CustomErrorController implements ErrorController {

private static final String PATH = "/error";

@RequestMapping(value = PATH)
public ResponseEntity<String> error(WebRequest webRequest, HttpServletResponse response) {
    return ResponseEntity.badRequest().body("");

}

@Override
public String getErrorPath() {
    return PATH;
     }

}

主要

@SpringBootApplication
public class BotMain {

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

}

【讨论】:

  • 这是正确的做法。只需在 handleError 方法中添加对 HTTP 状态代码 404 的检查即可。当前实现为所有错误返回 400
  • 它不适合我。 CustomErrorController 需要注解吗?
  • 你能检查一下吗,上面的解决方案对我有用并验证了它@Luke101
【解决方案2】:

我一定是错过了什么,尤其是在这方面的赏金。这真的不容易吗?我过去做过这样的事情:

@Controller
class foo {
    @GetMapping("**")
    public static ResponseEntity blah() {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
    }
}

由于 Spring 优先考虑匹配特定路径的最长映射,因此只有在没有其他匹配时才会获胜。

继续...请指出我缺少的内容。

【讨论】:

    【解决方案3】:

    我不知道你为什么要这样做。这是一个非常糟糕的做法。我会建议改变设计。如果你想做到这一点,你可以做几件事来实现这一点-

    1. 如果您使用任何(如 nginx),请在负载平衡器/服务器级别更改您的配置。这将是推荐的方法,因为您不希望此类更改成为您的代码库的一部分。代码库应仅包含业务逻辑、业务规则、领域逻辑等。
    2. 在您的 Spring Boot 代码库中创建一个拦截器,如果找不到控制器映射,则从那里返回 400 响应。从这里获得帮助-Spring: Checking if given endpoint exists

    【讨论】:

      【解决方案4】:

      我会尝试扩展 ResponseEntityExceptionHandler 类并覆盖 handleNoHandlerFoundException 以将其调整为错误请求。

      类似

      @ControllerAdvice
      public class AppRestExceptionHandler extends ResponseEntityExceptionHandler {
      
       @Override
          protected ResponseEntity<Object> handleNoHandlerFoundException(final NoHandlerFoundException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request) {
            HttpStatus newStatus = HttpStatus.NOT_FOUND;
            return handleExceptionInternal(ex, null, headers, newStatus, request);
          }
      }
      

      【讨论】:

        【解决方案5】:

        只需在您的控制器中编写这样的代码,HttpServletResponse 就会自动连接:

        
             @RequestMapping("/page")
             public String page(HttpServletResponse response) throws IOException {
                 if(doSomeThing()){
                     return "success";
                 } else {
                     response.sendError(HttpStatus.BAD_REQUEST.value(),"Message:400");
                     return "";
                 }
             }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-18
          • 1970-01-01
          • 1970-01-01
          • 2014-03-31
          • 2021-01-13
          • 2018-06-26
          • 2013-12-04
          相关资源
          最近更新 更多