Ошибка обработки 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, выбросьте Исключение из вашего контроллера бизнес-кода.