2012-12-12 3 views
0

을 보여주기 위해 예외를 찾을 수 없습니다구성보기는 우리가 일반적인 서블릿 매핑을 가지고 우리의 서버에서 404

<servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

문제는 없습니다 모든 * 수도 있었죠 URL이 너무로 끝나는 URL을 호출, 컨트롤러로 구성되어 있다는 점이다 * .do가 존재하지 않으면 500 오류가 발생하지만 * .do로 끝나지 않는 동일한 URL은 적절한 결과를 반환합니다.

그래서 원하는 경우 404를 반환하도록 DispatcherServlet을 구성하거나 적어도 모든 예외를 반환하고 404를 반환합니다.

답변

0

너머 configu 특히 404 오류를 catch하거나 다른 옵션이없는 배포 설명자에서 <error-page/> 요소를 호출하십시오. glassfish와 같은 전체 웹 응용 프로그램 컨테이너를 사용하는 경우 컨테이너 수준의 404 페이지를 다시 정의 할 수 있습니다. here을 구성별로 선택하십시오 (서블릿 3.0에는 새로운 옵션이 있습니다)

ViewNotFoundException은 JavaEE 스택에 없습니다 (컨테이너에 점프하고 있기 때문에 절대적으로 확인했습니다). 요청한 리소스를 제공 할 수있는 능력이 근본적으로 잘못된 것일 수도 있다는 첫 번째 힌트를 제어합니다.

4XX 시리즈 코드는 일반적으로 처리 할 수없는 오류 조건을 설명하기 때문에 일반적으로 개발자가 제어 할 수 없습니다 401-forbidden, 404-Not found 등) 또는 처리해서는 안되며, java의 런타임 예외와 비슷합니다.

1

컨트롤러 클래스 내에 위의 메서드를 추가하십시오. RuntimeExceptions조차 던져 질 모든 예외는이 메소드에서 잡힐 것입니다.

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
@ExceptionHandler(Exception.class) 
public ModelAndView handleException(Exception ex) { 
    Logger.getLogger(GuestNavController.class).error(ex); 
    ModelAndView modelAndView = initializeModelAndView("guest/error500"); 

    return modelAndView; 
} 

그것은 당신이 @ExceptionHandler 예외 매개 변수와 메소드의 인수를 변경하면 특정 예외를 잡을 수있을 것이다 (그들이 동일해야)하는 것이 분명하다.

컨트롤러 클래스가 두 개 이상인 경우 컨트롤러 도움말을 만들어야합니다. 소스 코드에 위의 클래스를 추가 할 수 있습니다.

@ControllerAdvice 
public class ExceptionManager { 
    private final Logger logger = Logger.getLogger(ExceptionManager.class); 

    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ExceptionHandler(NoHandlerFoundException.class) 
    public ModelAndView handleError404(Exception ex) { 
     logger.error("ERROR 404: " + ex.getMessage()); 

     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("guest/error404"); 
     return modelAndView; 
    } 
} 

이 클래스 내부에 하나 이상의 방법을 추가 할 수 있습니다. 이 메서드는 Throw되는 모든 예외를 캐치합니다.
위의 두 가지 해결 방법을 모두 포함하고있는 경우를 대비하여을주의하십시오. @ExceptionHandler 주석을 가지는 메소드를 포함한 컨트롤러에 예외가 슬로우되었을 경우, 예외는이 메서드에 의해서만 캐치되어 외부 클래스에서는 캐치되지 않습니다. 외부 클래스 (솔루션 2)는 내부 메서드 (솔루션 1)에 포착되지 않는 예외를 catch합니다.

관련 문제