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

我有一个控制器@RequestMapping(值= "/**",方法= RequestMethod.GET)和一些访问控制器的url,我希望容器提出一个404。


当前回答

从Spring 3.0.2开始,你可以返回ResponseEntity<T>作为控制器方法的结果:

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

(ResponseEntity<T>是一个比@ResponseBody注释更灵活的注释-参见另一个问题)

其他回答

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

因此,当任何控制器抛出404错误时,它将被调用。

像下面这样:

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

并将此404响应错误映射到web.xml中,如下所示:

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

希望能有所帮助。

从Spring 5.0开始,你不需要创建额外的异常:

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

此外,你可以用一个内置异常覆盖多个场景,你有更多的控制。

看到更多:

ResponseStatusException (javadoc) https://www.baeldung.com/spring-response-status-exception

这有点晚了,但如果你正在使用Spring Data REST,那么已经有org.springframework.data.rest.webmvc.ResourceNotFoundException 它还使用@ResponseStatus注释。不再需要创建自定义运行时异常。

简单地说,您可以使用web.xml添加错误代码和404错误页面。但是要确保404错误页面不能位于WEB-INF下面。

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

这是最简单的方法,但也有局限性。假设您希望为该页添加与其他页相同的样式。这样你就不能那样做了。你必须使用@ResponseStatus(value = HttpStatus.NOT_FOUND)

因为做同一件事至少有十种方法总是好的:

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class Something {
    @RequestMapping("/path")
    public ModelAndView somethingPath() {
        return new ModelAndView("/", HttpStatus.NOT_FOUND);
    }
}