2012-04-29 2 views
11

Я хочу запускать страницу 404, когда мне не передавали все параметры. Допустим, у меня есть следующий URI:Spring MVC - как вернуть 404 по отсутствующим параметрам

/myapp/op?param1=1&[email protected]=3 

В случае на параметры WASN, т вызывается я хочу вернуть 404 страницу. Я пробовал делать:

@ResponseStatus(HttpStatus.NOT_FOUND) 
@RequestMapping(value = "op", params = { "!param1" }) 
public void missingArg() { 
} 

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

Как я могу это сделать?

ответ

27

Если вы используете Spring 3.1 вы можете определить класс исключения, как так:

@ResponseStatus(value = HttpStatus.NOT_FOUND) 
public final class ResourceNotFoundException extends RuntimeException { 
    // class definition 
} 

Теперь, когда вы бросаете это исключение, Spring вернет статус HTTP, определенный в вашем @ResponseStatus аннотации. Например:

@RequestMapping(value = "/op") 
public void methodWithRequestParams(@RequestParam(value = "param1", required = false) String param1, 
     @RequestParam(value = "param2", required = false) String param2) { 
    if (param1 == null || param2 == null) { 
    throw new ResourceNotFoundException(); 
    } 
} 

возвратит 404 когда param1 или param2 равна нулю.

+0

Спасибо, что сработало. Хотя это решение кажется мне немного неудобным, он выполнил свою работу. – s0li

+0

Как получить пользовательский корпус/полезную нагрузку –

7

Вам не нужно реализовывать функцию missingArg(). Если для входящего запроса не существует метода сопоставления, то Spring HandlerExceptionResolver будет обрабатывать его и возвращать ответ с соответствующим кодом состояния.

Spring автоматически преобразует параметры запроса в параметры метода, если вы не используете @RequestParam аннотацию:

@RequestMapping(value = "/op") 
public void methodWithRequestParams(@RequestParam("param1") String param1, 
     @RequestParam("param2") String param2, 
     @RequestParam("param3") String param3) { 

    // do something with params 
} 

По соглашению, метод methodWithRequestParams() не будет вызываться, если не все PARAMS являются частью запроса (если required атрибут @RequestParam установлен в false).

Также обратите внимание, что параметры не обязательно должны быть строками.

+0

Проблема заключается в том, что код ответа составляет 400 (или что-то другое, чем 404). У меня нет контроля над тем, какой код ответа или какая страница возвращается. – s0li

+8

Ну, '400 - Bad Request' - это, на мой взгляд, более точный код ответа, который' 404'. После того, как весь ресурс (идентифицированный с помощью URL-адреса '/ op') существует, но параметры запроса неверны, т. Е. Плохой запрос. Если вам нужен конкретный ресурс и ответ '404', если он не существует, я предлагаю вам использовать' @RequestMapping ("/ op/{id}") 'в сочетании с [@PathVariable] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates) аннотации. – matsev

1

Повторяя, что сказал matsev в комментариях другого ответа, вы не должны использовать @ResponseStatus(HttpStatus.NOT_FOUND) в этом случае, а скорее @ResponseStatus(HttpStatus.BAD_REQUEST).

@ResponseStatus(HttpStatus.NOT_FOUND) следует использовать, когда запрос был сформирован должным образом, но ресурса там нет.

Смежные вопросы