Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 696
solyd Avatar asked Apr 29 '12 13:04

solyd


3 Answers

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.

like image 198
Tim Pote Avatar answered Oct 07 '22 04:10

Tim Pote


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.

like image 31
matsev Avatar answered Oct 07 '22 02:10

matsev


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.

like image 22
fivedogit Avatar answered Oct 07 '22 03:10

fivedogit