Статус http с несколькими ответами в Spring MVC - PullRequest
9 голосов
/ 19 сентября 2011

Имея следующий код:

@RequestMapping(value =  "/system/login", method = RequestMethod.GET)
public void login(@RequestBody Login login) {
    if(login.username == "test" && login.password == "test") {
         //return HTTP 200
    }
    else {
         //return HTTP 400
    }
}

Я хотел бы вернуть два разных состояния HTTP на основе моей логики. Каков наилучший способ добиться этого?

1 Ответ

19 голосов
/ 23 сентября 2011

Один подход, который кто-то предложил в SO, - это генерировать разные исключения, которые будут отлавливаться разными обработчиками исключений:

@RequestMapping(value =  "/system/login", method = RequestMethod.GET)
public void login(@RequestBody Login login) {
    if(login.username == "test" && login.password == "test") {
         throw new AllRightException();
    }
    else {
         throw new AccessDeniedException();
    }
}

@ExceptionHandler(AllRightException.class)
@ResponseStatus(HttpStatus.OK)
public void whenAllRight() {

}

@ExceptionHandler(AccessDeniedException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void whenAccessDenied() {

}

См. Также:

Кстати, ваш пример кода содержит ошибку: login.password == "test" вы должны использовать equals() там:)


Обновлено : я нашел другой подход, который даже лучше, потому что он не использует исключения:

@RequestMapping(value =  "/system/login", method = RequestMethod.GET)
public ResponseEntity<String> login(@RequestBody Login login) {
    if(login.username == "test" && login.password == "test") {
         return new ResponseEntity<String>("OK" HttpStatus.OK);
    }

    return new ResponseEntity<String>("ERROR", HttpStatus.BAD_REQUEST);
}

См. Также ResponseEntity API

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