2012-04-29 13 views
11

Quiero activar la página 404 cada vez que no pasé todos los parámetros. Digamos que tengo el siguiente URI:Spring MVC - cómo devolver 404 en parámetros faltantes

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

En el caso de los parámetros había; t invocarse quiero volver página 404. He intentado hacer:

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

pero luego me sale una excepción que me dice que hay ambigüedad entre los métodos que manejan faltante segundo y tercer parámetro.

¿Cómo puedo lograr esto, entonces?

Respuesta

27

Si está utilizando Spring 3.1 puede definir una clase de excepción de este modo:

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

Ahora cada vez que lanza esta excepción, la primavera volverá al estado HTTP definido en su @ResponseStatus anotación. Por ejemplo:

@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(); 
    } 
} 

devolverá un 404 siempre param1 o param2 es nulo.

+0

Gracias, eso funcionó. Aunque esta solución me parece un poco incómoda, hizo el trabajo. – s0li

+0

¿Cómo se obtiene un cuerpo personalizado/carga útil? –

7

No tiene que implementar la función missingArg(). Si no hay un método de coincidencia para la solicitud entrante, el HandlerExceptionResolver de Spring lo manejará y devolverá una respuesta con un código de estado apropiado.

primavera convertirá automáticamente los parámetros de la petición en los parámetros del método si se utiliza el @RequestParam anotación:

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

    // do something with params 
} 

Por convención, el método methodWithRequestParams() no será llamado si no todos los parametros son parte de la solicitud (a menos que el required atributo del @RequestParam se establece en false).

También tenga en cuenta que los parámetros no tienen que ser cadenas.

+0

El problema con esto es que el código de respuesta es 400 (o algo distinto a 404) - No tengo control sobre qué código de respuesta o qué página se devuelve. – s0li

+8

Bueno, un '400 - Solicitud incorrecta' es, en mi opinión, un código de respuesta más preciso que el' 404'. Después de que exista todo el recurso (identificado con la URL '/ op'), pero los parámetros de solicitud son incorrectos, es decir, una solicitud incorrecta. Si desea un recurso específico y una respuesta '404' si no existe, le sugiero que use' @RequestMapping ("/ op/{id}") 'junto con [@PathVariable] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates) anotación. – matsev

1

Haciendo eco de lo que dijo matsev en los comentarios de otra respuesta, no debería usar @ResponseStatus(HttpStatus.NOT_FOUND) en este caso, sino más bien @ResponseStatus(HttpStatus.BAD_REQUEST).

@ResponseStatus(HttpStatus.NOT_FOUND) se debe utilizar cuando la solicitud se formó correctamente, pero el recurso no está allí.

Cuestiones relacionadas