在Spring-MVC控制器中触发404?

java spring spring-mvc

114104 观看

13回复

3266 作者的声誉

如何让Spring 3.0控制器触发404?

我有一个控制器,@RequestMapping(value = "/**", method = RequestMethod.GET)有些URL访问控制器,我希望容器能够提供404。

作者: NA. 的来源 发布者: 2010 年 1 月 14 日

回应 (13)


35

111219 作者的声誉

重写您的方法签名,使其HttpServletResponse作为参数接受,以便您可以调用setStatus(int)它。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments

作者: matt b 发布者: 14.01.2010 07:39

298

207751 作者的声誉

决定

从Spring 3.0开始,你也可以抛出一个用@ResponseStatus注释声明的异常:

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    ...
}

@Controller
public class SomeController {
    @RequestMapping.....
    public void handleCall() {
        if (isFound()) {
            // whatever
        }
        else {
            throw new ResourceNotFoundException(); 
        }
    }
}
作者: axtavt 发布者: 14.01.2010 07:43

24

8604 作者的声誉

我想提一下,由Spring提供的默认值为404(不仅仅是)。请参阅Spring文档了解详细信息 因此,如果您不需要自己的例外,您可以这样做:

 @RequestMapping(value = "/**", method = RequestMethod.GET)
 public ModelAndView show() throws NoSuchRequestHandlingMethodException {
    if(something == null)
         throw new NoSuchRequestHandlingMethodException("show", YourClass.class);

    ...

  }
作者: michal.kreuzman 发布者: 04.06.2012 10:32

0

502 作者的声誉

您只需使用web.xml添加错误代码和404错误页面即可。但请确保404错误页面不能位于WEB-INF下。

<error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
</error-page>

这是最简单的方法,但这有一些限制。假设您要为添加了其他页面的页面添加相同的样式。这样你就不能那样了。你必须使用@ResponseStatus(value = HttpStatus.NOT_FOUND)

作者: Rajith Delantha 发布者: 06.11.2012 02:58

9

92371 作者的声誉

如果您的控制器方法适用于文件处理,那么ResponseEntity非常方便:

@Controller
public class SomeController {
    @RequestMapping.....
    public ResponseEntity handleCall() {
        if (isFound()) {
            return new ResponseEntity(...);
        }
        else {
            return new ResponseEntity(404);
        }
    }
}
作者: Ralph 发布者: 20.03.2013 04:17

0

357 作者的声誉

使用设置配置web.xml

<error-page>
    <error-code>500</error-code>
    <location>/error/500</location>
</error-page>

<error-page>
    <error-code>404</error-code>
    <location>/error/404</location>
</error-page>

创建新控制器

   /**
     * Error Controller. handles the calls for 404, 500 and 401 HTTP Status codes.
     */
    @Controller
    @RequestMapping(value = ErrorController.ERROR_URL, produces = MediaType.APPLICATION_XHTML_XML_VALUE)
    public class ErrorController {


        /**
         * The constant ERROR_URL.
         */
        public static final String ERROR_URL = "/error";


        /**
         * The constant TILE_ERROR.
         */
        public static final String TILE_ERROR = "error.page";


        /**
         * Page Not Found.
         *
         * @return Home Page
         */
        @RequestMapping(value = "/404", produces = MediaType.APPLICATION_XHTML_XML_VALUE)
        public ModelAndView notFound() {

            ModelAndView model = new ModelAndView(TILE_ERROR);
            model.addObject("message", "The page you requested could not be found. This location may not be current.");

            return model;
        }

        /**
         * Error page.
         *
         * @return the model and view
         */
        @RequestMapping(value = "/500", produces = MediaType.APPLICATION_XHTML_XML_VALUE)
        public ModelAndView errorPage() {
            ModelAndView model = new ModelAndView(TILE_ERROR);
            model.addObject("message", "The page you requested could not be found. This location may not be current, due to the recent site redesign.");

            return model;
        }
}
作者: Atish Narlawar 发布者: 28.04.2014 09:30

14

0 作者的声誉

您可以使用@ControllerAdvice来处理异常,@ ControllerAdvice注释类的默认行为将协助所有已知的控制器。

所以当你有任何控制器抛出404错误时会调用它。

如下:

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.NOT_FOUND)  // 404
    @ExceptionHandler(Exception.class)
    public void handleNoTFound() {
        // Nothing to do
    }
}

并在您的web.xml中映射此404响应错误,如下所示:

<error-page>
        <error-code>404</error-code>
        <location>/Error404.html</location>
</error-page>

希望有助于。

作者: user957654 发布者: 05.10.2014 10:41

20

12883 作者的声誉

从Spring 3.0.2开始,您可以通过控制器的方法返回ResponseEntity

@RequestMapping.....
public ResponseEntity<Object> handleCall() {
    if (isFound()) {
        // do what you want
        return new ResponseEntity<>(HttpStatus.OK);
    }
    else {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}

(ResponseEntity 比@ResponseBody注释更灵活 - 请参阅另一个问题

作者: Lu55 发布者: 31.07.2015 11:39

6

196 作者的声誉

我建议像这样抛出HttpClientErrorException

@RequestMapping(value = "/sample/")
public void sample() {
    if (somethingIsWrong()) {
        throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
    }
}

您必须记住,只有在将任何内容写入servlet输出流之前,才能执行此操作。

作者: mmatczuk 发布者: 16.12.2015 09:01

6

4002 作者的声誉

虽然明确的答案是正确的,但有一种方法可以实现这一点,没有例外。该服务返回Optional<T>搜索到的对象,HttpStatus.OK如果找到则映射到404,如果为空则映射到404。

@Controller
public class SomeController {

    @RequestMapping.....
    public ResponseEntity<Object> handleCall() {
        return  service.find(param).map(result -> new ResponseEntity<>(result, HttpStatus.OK))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }
}

@Service
public class Service{

    public Optional<Object> find(String param){
        if(!found()){
            return Optional.empty();
        }
        ...
        return Optional.of(data); 
    }

}
作者: user1121883 发布者: 22.03.2017 08:02

1

139 作者的声誉

此外,如果您想从控制器返回404状态,您只需要执行此操作

@RequestMapping(value = "/somthing", method = RequestMethod.POST)
@ResponseBody
public HttpStatus doSomthing(@RequestBody String employeeId) {
    try{
  return HttpStatus.OK;
    } 
    catch(Exception ex){ 
  return HttpStatus.NOT_FOUND;
    }
}

通过这样做,如果您想从控制器返回404,您将收到404错误。

作者: AbdusSalam 发布者: 04.09.2017 02:37

2

541 作者的声誉

这有点晚了,但如果您使用的是Spring Data REST,那么org.springframework.data.rest.webmvc.ResourceNotFoundException 它也已经使用了@ResponseStatus注释。无需再创建自定义运行时异常。

作者: pilot 发布者: 16.04.2018 01:48

0

300 作者的声誉

您不一定需要创建其他例外:

throw new ResponseStatusException(NOT_FOUND, "Unable to find resource");

此外,您可以使用一个内置异常覆盖多个方案,并且您可以拥有更多控制权。

看更多:

作者: Joni 发布者: 15.04.2019 01:24
32x32