solyd
solyd

Reputation: 792

Spring MVC - how to return 404 on missing parameters

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&param2=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

Answers (3)

Tim Pote
Tim Pote

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

fivedogit
fivedogit

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

matsev
matsev

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

Related Questions