Как вернуть код состояния 400, если путь не найден - PullRequest
1 голос
/ 12 апреля 2019

У меня есть REST-приложение с весенней загрузкой. Мне нужно вернуть код состояния 400 неправильных запросов, когда путь не существует. Рассмотрим:

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

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

Как я могу это сделать, используя пружинную загрузку

Ответы [ 5 ]

4 голосов
/ 12 апреля 2019

Это работает для пружинной загрузки-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;
     }

}

Main

@SpringBootApplication
public class BotMain {

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

}
0 голосов
/ 18 апреля 2019

Просто напишите код в вашем контроллере, HttpServletResponse будет автоматически подключен:


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

0 голосов
/ 17 апреля 2019

Я бы попытался расширить класс 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);
    }
}
0 голосов
/ 15 апреля 2019

Я не знаю, почему вы хотели бы сделать это.Это очень плохая практика.Я бы порекомендовал изменить дизайн.Если вы хотите сделать это, есть несколько вещей, которые вы можете сделать для достижения этой цели:

  1. Измените ваши настройки на уровне балансировки нагрузки / сервера, если вы используете какой-либо (например, nginx).Это будет рекомендуемый подход, так как вы не хотите, чтобы такие изменения были частью вашей кодовой базы.Кодовая база должна содержать только бизнес-логику, бизнес-правила, доменную логику и т. Д.
  2. Создайте перехватчик в вашей кодовой базе пружинной загрузки и верните оттуда ответ 400, если сопоставление контроллера не найдено.Возьмите помощь отсюда - Spring: Проверка, существует ли данная конечная точка
0 голосов
/ 15 апреля 2019

Я, должно быть, что-то упустил, особенно с наградой за это. Разве это не легко? Я делал что-то подобное в прошлом:

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

Поскольку Spring отдает приоритет самому длинному отображению, соответствующему определенному пути, он выигрывает только в том случае, если больше ничего не соответствует.

Давай ... укажите, что мне не хватает, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...