I want to trigger 404 page whenever I wasn't passed all of the parameters. Lets say I have the following URI:
/myapp/op?param1=1¶m2=2@param3=3
In case on of the parameters wasn;t invoked I want to return 404 page. I tried doing:
@ResponseStatus(HttpStatus.NOT_FOUND)
@RequestMapping(value = "op", params = { "!param1" })
public void missingArg() {
}
but then I get an exception telling me there is ambiguity between methods that handle missing second and third parameter.
How can I accomplish this, then?
If you're using Spring 3.1 you can define an exception class like so:
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class ResourceNotFoundException extends RuntimeException {
// class definition
}
Now whenever you throw that exception, Spring will return the http status defined in your @ResponseStatus
annotation. For example:
@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();
}
}
will return a 404
whenever param1
or param2
is null.
You do not have to implement the missingArg()
function. If there is no matching method for the incoming request, then Spring's HandlerExceptionResolver will handle it and return a response with an appropriate status code.
Spring will automatically convert the request parameters into method parameters if you use the @RequestParam annotation:
@RequestMapping(value = "/op")
public void methodWithRequestParams(@RequestParam("param1") String param1,
@RequestParam("param2") String param2,
@RequestParam("param3") String param3) {
// do something with params
}
By convention, the methodWithRequestParams()
method will not be called if not all params are part of the request (unless the required
attribute of the @RequestParam
is set to false
).
Also note that the parameters does not have to be Strings.
Echoing what matsev said in the comments of another answer, you should not be using @ResponseStatus(HttpStatus.NOT_FOUND)
in this case, but rather @ResponseStatus(HttpStatus.BAD_REQUEST)
.
@ResponseStatus(HttpStatus.NOT_FOUND)
should be used when the request was formed properly, but the resource isn't there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With