我有一个Spring Boot REST应用程序。当路径不存在时,我需要返回400错误请求的状态码。考虑:
This is a good url
localhost:8080/mypath?name=test
Bad Path (return status 400)
localhost:8080/mybadpath?name=test
如何使用弹簧靴做到这一点
答案 0 :(得分:4)
通过实施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);
}
}
答案 1 :(得分:0)
我一定想念一些东西,尤其是在赏金上。这不是很容易吗?我过去做过这样的事情:
@Controller
class foo {
@GetMapping("**")
public static ResponseEntity blah() {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
}
由于Spring会优先考虑与特定路径匹配的最长映射,因此只有在其他条件都不匹配的情况下才会获胜。
继续...请指出我想念的东西。
答案 2 :(得分:0)
我不知道您为什么要这样做。这是非常不好的做法。我建议更改设计。如果您想这样做,您可以做几件事来实现这一目的-
答案 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 "";
}
}