找不到路径时如何返回状态码400

时间:2019-04-12 20:28:33

标签: java spring-boot

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

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

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

如何使用弹簧靴做到这一点

5 个答案:

答案 0 :(得分:4)

通过实施ErrorController

,此功能适用于Spring Boot 2.1.3
@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);
    }

}

答案 1 :(得分:0)

我一定想念一些东西,尤其是在赏金上。这不是很容易吗?我过去做过这样的事情:

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

由于Spring会优先考虑与特定路径匹配的最长映射,因此只有在其他条件都不匹配的情况下才会获胜。

继续...请指出我想念的东西。

答案 2 :(得分:0)

我不知道您为什么要这样做。这是非常不好的做法。我建议更改设计。如果您想这样做,您可以做几件事来实现这一目的-

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

答案 3 :(得分:0)

我会尝试扩展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);
    }
}

答案 4 :(得分:0)

就像在您的控制器中这样的代码,HttpServletResponse将被自动连接:


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