Reputation: 792
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?
Upvotes: 11
Views: 20624
Reputation: 28029
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.
Upvotes: 27
Reputation: 8524
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.
Upvotes: 1
Reputation: 33769
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.
Upvotes: 7