Ошибка обработки 404 с помощью контроллера Spring
Я использую @ExceptionHandler
для обработки исключений, созданных моим веб-приложением, в моем случае мое приложение возвращает ответ JSON
с HTTP status
для ответов об ошибках клиенту.
Однако я пытаюсь понять, как обращаться с error 404
, чтобы вернуть аналогичный ответ JSON, например, с помощью @ExceptionHandler
Update:
Я имею в виду, когда доступ к URL, который не существует,
Ответы
Ответ 1
Самый простой способ узнать: использовать
@ExceptionHandler(Throwable.class)
public String handleAnyException(Throwable ex, HttpServletRequest request) {
return ClassUtils.getShortName(ex.getClass());
}
Если URL-адрес находится в пределах области DispatcherServlet, тогда любой 404, вызванный ошибкой или чем-либо еще, будет пойман этим методом, но если введенный URL-адрес превышает сопоставление URL-адреса DispatcherServlet, вам необходимо либо использовать:
<error-page>
<exception-type>404</exception-type>
<location>/404error.html</location>
</error-page>
или
Обеспечьте отображение "/" на ваш URL-адрес сопоставления DispatcherServlet, чтобы обрабатывать все сопоставления для конкретного экземпляра сервера.
Ответ 2
Я использую spring 4.0 и java-конфигурацию. Мой рабочий код:
@ControllerAdvice
public class MyExceptionController {
@ExceptionHandler(NoHandlerFoundException.class)
public ModelAndView handleError404(HttpServletRequest request, Exception e) {
ModelAndView mav = new ModelAndView("/404");
mav.addObject("exception", e);
//mav.addObject("errorcode", "404");
return mav;
}
}
В JSP:
<div class="http-error-container">
<h1>HTTP Status 404 - Page Not Found</h1>
<p class="message-text">The page you requested is not available. You might try returning to the <a href="<c:url value="/"/>">home page</a>.</p>
</div>
Для параметра конфигурации Init:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
public void customizeRegistration(ServletRegistration.Dynamic registration) {
registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
}
}
Или через xml:
<servlet>
<servlet-name>rest-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
См. также: Spring MVC spring Безопасность и обработка ошибок
Ответ 3
С помощью spring > 3.0 используйте @ResponseStatus
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
...
}
@Controller
public class MyController {
@RequestMapping.....
public void handleCall() {
if (isFound()) {
// do some stuff
}
else {
throw new ResourceNotFoundException();
}
}
}
Ответ 4
Вы можете использовать стандартный способ сервлета для обработки ошибки 404. Добавьте следующий код в web.xml
<error-page>
<exception-type>404</exception-type>
<location>/404error.html</location>
</error-page>
Ответ 5
public final class ResourceNotFoundException extends RuntimeException {
}
@ControllerAdvice
public class AppExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleNotFound() {
return "404";
}
}
Просто определите Exception, ExceptionHandler, выбросьте Исключение из вашего контроллера бизнес-кода.