Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC-如何在缺少参数时返回404_Java_Spring Mvc - Fatal编程技术网

Java Spring MVC-如何在缺少参数时返回404

Java Spring MVC-如何在缺少参数时返回404,java,spring-mvc,Java,Spring Mvc,当我没有通过所有参数时,我想触发404页。假设我有以下URI: /myapp/op?param1=1&param2=2@param3=3 如果参数不正确,则为on;我想返回404页。我试着做: @ResponseStatus(HttpStatus.NOT_FOUND) @RequestMapping(value = "op", params = { "!param1" }) public void missingArg() { } 但我得到一个异常,告诉我处理缺失的第二个和第三个参数

当我没有通过所有参数时,我想触发404页。假设我有以下URI:

/myapp/op?param1=1&param2=2@param3=3
如果参数不正确,则为on;我想返回404页。我试着做:

@ResponseStatus(HttpStatus.NOT_FOUND)
@RequestMapping(value = "op", params = { "!param1" })
public void missingArg() {
}
但我得到一个异常,告诉我处理缺失的第二个和第三个参数的方法之间存在歧义


那么,我如何才能做到这一点呢?

您不必实现
missingArg()
函数。如果传入请求没有匹配的方法,Spring将处理它并返回一个带有适当状态代码的响应

如果使用注释,Spring将自动将请求参数转换为方法参数:

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

    // do something with params
}
按照惯例,如果并非所有参数都是请求的一部分,则不会调用
methodWithRequestParams()
方法(除非
@RequestParam
required
属性设置为
false


还请注意,参数不必是字符串。

如果您使用的是Spring 3.1,您可以定义一个异常类,如下所示:

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class ResourceNotFoundException extends RuntimeException {
   //  class definition
}
现在,无论何时抛出该异常,Spring都将返回在
@ResponseStatus
注释中定义的http状态。例如:

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

每当
param1
param2
为空时,将返回
404

与matsev在另一个答案的评论中所说的一样,在这种情况下,您不应该使用
@ResponseStatus(HttpStatus.not_FOUND)
,而应该使用
@ResponseStatus(HttpStatus.BAD_REQUEST)


@ResponseStatus(HttpStatus.NOT_FOUND)
应该在请求格式正确时使用,但资源不在那里。

问题是repsonse代码是400(或404以外的其他代码)-我无法控制返回的响应代码或页面。嗯,
400-错误请求
在我看来是比
404
更准确的响应代码。所有资源(由
/op
url标识)存在后,但请求参数错误,即请求错误。如果您想要一个特定的资源和一个
404
响应(如果它不存在的话),我建议您将
@RequestMapping(“/op/{id}”)
与注释结合使用。谢谢,这很有效。虽然这个解决方案对我来说有点尴尬,但它完成了任务。如何获得定制的车身/有效载荷