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

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


当前回答

你可以使用@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默认提供了404异常(不仅是)。有关详细信息,请参阅Spring文档。所以如果你不需要自己的异常,你可以简单地这样做:

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

    ...

  }

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

@Controller
public class SomeController {
    @RequestMapping.....
    public ResponseEntity handleCall() {
        if (isFound()) {
            return new ResponseEntity(...);
        }
        else {
            return new ResponseEntity(404);
        }
    }
}

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

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

重写你的方法签名,使它接受HttpServletResponse作为参数,这样你就可以对它调用setStatus(int)。

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

如果你想从控制器返回404状态,你只需要这样做

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

通过这样做,当您想从控制器返回404时,您将收到一个404错误。