Como obtenho um controlador Spring 3.0 para disparar um 404?
Eu tenho um controlador com @RequestMapping(value = "/**", method = RequestMethod.GET)
e para alguns URLs acessando o controlador, quero que o contêiner crie um 404.
java
spring
spring-mvc
N / D.
fonte
fonte
@ResponseStatus
é que você defina um monte de classes de exceção bem tipificadas e fortemente tipadas, cada uma com a sua@ResponseStatus
. Dessa forma, você separa o código do controlador dos detalhes dos códigos de status HTTP.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
por uma implementação vazia.A partir do Spring 5.0, você não precisa necessariamente criar exceções adicionais:
Além disso, você pode cobrir vários cenários com uma exceção integrada e ter mais controle.
Ver mais:
fonte
Reescreva sua assinatura de método para que ela aceite
HttpServletResponse
como parâmetro, para que você possa acessásetStatus(int)
-la.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
fonte
setStatus(int)
javadoc declara o seguinte: Se este método for usado para definir um código de erro, o mecanismo da página de erro do contêiner não será acionado. Se houver um erro e o chamador desejar chamar uma página de erro definida no aplicativo da web, elesendError
deverá ser usado.Gostaria de mencionar que há uma exceção (não apenas) para 404, por padrão, fornecida pelo Spring. Consulte a documentação do Spring para obter detalhes. Portanto, se você não precisar de sua própria exceção, basta fazer o seguinte:
fonte
@PathVariable
não há tratamento de solicitações do meu ponto de vista. Você acha que é melhor / mais limpo usar sua própria exceção anotada@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Desde o Spring 3.0.2, você pode retornar o ResponseEntity <T> como resultado do método do controlador:
(ResponseEntity <T> é mais flexível que a anotação @ResponseBody - veja outra pergunta )
fonte
você pode usar o @ControllerAdvice para lidar com suas exceções. O comportamento padrão da classe anotada @ControllerAdvice ajudará todos os controladores conhecidos.
por isso, será chamado quando qualquer controlador que você lança erro 404.
como o seguinte:
e mapeie esse erro de resposta 404 no seu web.xml, como o seguinte:
Espero que ajude .
fonte
Se o método do seu controlador for para algo como manipulação de arquivos,
ResponseEntity
é muito útil:fonte
Embora a resposta marcada esteja correta, há uma maneira de conseguir isso sem exceções. O serviço está retornando
Optional<T>
do objeto pesquisado e isso é mapeado paraHttpStatus.OK
se encontrado e para 404 se estiver vazio.fonte
Eu recomendo lançar HttpClientErrorException , como este
Você deve se lembrar que isso só pode ser feito antes que algo seja gravado no fluxo de saída do servlet.
fonte
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
É um pouco tarde, mas se você estiver usando o Spring Data REST , já existe.
org.springframework.data.rest.webmvc.ResourceNotFoundException
Ele também usa@ResponseStatus
anotação. Não há mais necessidade de criar uma exceção de tempo de execução customizada.fonte
Além disso, se você deseja retornar o status 404 do seu controlador, tudo o que você precisa é fazer isso
Ao fazer isso, você receberá um erro 404 no caso em que deseja retornar um 404 do seu controlador.
fonte
Simplesmente você pode usar o web.xml para adicionar código de erro e página de erro 404. Mas verifique se a página de erro 404 não deve ser localizada em WEB-INF.
Essa é a maneira mais simples de fazer isso, mas isso tem algumas limitações. Suponha que, se você deseja adicionar o mesmo estilo para esta página, você adicionou outras páginas. Desta forma, você não pode fazer isso. Você tem que usar o
@ResponseStatus(value = HttpStatus.NOT_FOUND)
fonte
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
partir do código do controlador. Agora, do lado de fora, a resposta não parece diferente de um 404 normal que não atingiu nenhum controlador.Configure web.xml com a configuração
Criar novo controlador
fonte
Porque é sempre bom ter pelo menos dez maneiras de fazer a mesma coisa:
fonte