2010-07-14 4 views
5

응용 프로그램에서 예외를 관리하기위한 "fault barrier"전략을 구현하고 싶습니다. 애플리케이션에있는 한 가지 기능은 "패스 백 (passback)"응답의 개념입니다. 기본적으로 아무 작업도하지 않으므로 500, 400 등을 던지는 것보다 우선적으로 반환하고 싶습니다. HTTP 상태 코드 - 예 : 기본 예외가 throw 된 경우에도 우리의 외부 직면 응용 프로그램은 항상 유효한 응답을 반환해야합니다. 응용 프로그램의 내부 예외를 처리하고 여전히 유효한 noop 응답을 반환하고 싶습니다.오류 페이지 상태 코드 반환 200 기본 응답

우리의 첫 번째 구현은, 예를 들어, try/catch 블록에서 모든 요청을 포장하고, 캐치에서 기본 수익을 반환 서블릿 필터 :이 대부분 작동하지만

try{ 
    chain.doFilter() 
} catch (Throwable t) { 
    generatePassbackResponse(HttpServletRequest req, HttpServletResponse res) 
} 

을, 좋은 느낌 하나의 문제는 Exception이 Throw되었을 때 여전히 응답이 Status-Code : 500으로 끝난다는 것입니다.

HttpServletResponse.setStatus (예 : 멋진 텍스트를 반환 할 수 있습니다. 200)은 효과가 없으며 javadoc은 일반적인 요청에만 적용됩니다.

두 번째 구현 생각은 다른 페이지로 전달하거나 errorPage를 web.xml에 연결하고 해당 페이지로 수동으로 sendError를 보내야한다는 것입니다. 특정 추천자가 있는지 여부에 관심이 있지만.

답변

0

당신은뿐만 아니라 표준 web.xml의 구성을 사용할 수 :

<error-page> 
    <error-code>500</error-code> 
    <location>/error.jsp</location> 
</error-page> 

<error-page> 
    <location>/error.jsp</location> 
    <exception-type>java.lang.Exception</exception-type> 
</error-page> 

난 당신이 이미 수용하지 않는 것을하려고 노력하고 그 밖의 무엇을 볼 수 없습니다? 단지 오류 코드라면 응답 객체를 사용하여 설정할 수 있다고 생각합니다.

+0

우리가 시도한 기본 오류 페이지 처리기는 상태 코드를 무시할 수있는 것으로 보이지 않습니다. 상태 코드는 우리가 처리하려고 시도하는 것의 큰 부분이며 적어도 Glassfish에서는 응답 개체가 오류 응답에서 상태 코드를 설정할 수있는 것처럼 보이지 않습니다. 이것들은 서버 대 서버 응답이므로 대부분의 경우 사용자 브라우저가 아닙니다. RESTful 응답의 경우 상태 코드가 상당히 중요 할 수 있습니다. – jayshao

1

정확하게 기억한다면, 다른 사람이 요청을 처리하기를 원하지 않으면 chain.doFilter()를 호출하면 안됩니다. 필터는 모든 경우에 실행되지만 chain.doFilter()는 다른 모든 필터가 호출되도록합니다. 예외를 적절히 차단하여 사용자에게 도달하지 못하게하려면 요청/응답 처리를 중지해야합니다.

Spring과 같은 인터셉터 (필터처럼)를 사용하여 다른 경로를 사용할 수도 있습니다. Spring은 인터셉터와 응답 처리 방법에 대한 많은 제어권을 제공합니다. 허락하신다면, 이것은 약간의 질문에 대한 해결책입니다. http://java.sun.com/products/servlet/Filters.html에 따라 주석에 대한 응답으로

:

:

필터 인터페이스에서 가장 중요한 방법은 doFilter 방법은 ...이 방법은 일반적으로 다음 작업 중 일부 수행

현재 필터가 대상 서블릿으로 끝나는 체인의 마지막 필터 인 경우 다음 엔티티는 체인의 끝에있는 리소스입니다. 그렇지 않은 경우 이 WAR에 구성되어있는 다음 필터입니다. 체인 객체 에 대해 doFilter 메서드를 호출하여 을 호출하고 요청 및 응답 이 호출되었거나 호출 된 버전의 응답을 전달합니다. 또는 에 대한 호출이 다음 엔터티를 호출하지 않도록하여 요청을 차단하도록 선택할 수 있습니다. 후자의 경우 의 경우 필터는 응답을 작성합니다.

"장애 장벽"은 다른 모든 필터 실행을 중지하고 필요하다고 판단되는 방식으로 요청/응답을 처리해야한다는 아이디어가 있습니다.

+0

'Filter # doFilter()'메소드에서'RequestDispatcher # forward()'또는'HttpServletResponse # sendRedirect()'를 호출 할 때마다'FilterChain # doFilter()'를 호출하면 안됩니다. 이것은 여기에 해당하지 않습니다. – BalusC

+0

목표는 던져진 예외를 잡아 내고 일반 필터를 사용하기 때문에 doFilter를 호출해야합니다.하지만 이것은 백 버닝 된 것이므로 지금은 추상/디스패처 서블릿에서 무엇을 얻을 수 있는지 알아볼 것입니다. 우리는 원한다. – jayshao

0

RESTEasy 프레임 워크를 사용하면 ExceptionMappers를 사용하여 응답 코드를 선택할 수 있습니다. 당신이 그것을 사용하기를 꺼려 할지도 모르지만, 나는 그것이 매우 빠르고 효율적이라는 것을 알았습니다.

JBoss의 문서를 다루는 ExceptionMappers http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html_single/index.html#ExceptionMappers

http://gary-rowe.com/agilestack/2010/08/22/my-current-development-stack/

+0

우리가 그것을 사용하는 것을 꺼리는 것으로 설명 할 수 있을지 모르겠다.하지만이 경우에는 dev 프레임 워크를 전환하는 것에 대해 과도한 생각이 들었다. – jayshao

+0

필자는 설득력있는 이유 (그러므로 "사용하기를 꺼려"하지 않는 한) 모두가 잘 알고있는 개발 프레임 워크를 변경하지는 않겠지 만 전환이 상대적으로 쉽지 않을 수도 있습니다. –

2

이 두 가지 방법은 응답의 HTTP 상태 설정 형성 범용 RESTEasy가 코드의 조각을 보여주는 내 블로그 기사 :

  • setStatus()은 상태를 설정 만합니다.
  • 대해 sendError()<error-page> 메커니즘

자바 독 에 대해 sendError는 응답이 대해 sendError를 호출 한 후 최선을 다하고 것으로 간주해야한다고 말했습니다 상태 트리거를 설정합니다 (이의 행동을 설명 할 수 귀하의 응용 서버). 사용자 정의 HttpServletResponseWrapper 구현

이 동작을 적용 할 수 있습니다 것입니다 당신 필요성에 대한 대해 sendError (당신이 요청 될 시점 이후에 발생한 예외 "패스 백"보낼 수 있도록 어쩌면, 메모리에 전체 요청 버퍼 보통 커밋 됨).

관련 문제