50.4. 예외를 응답에 매핑
50.4.1. 개요
WebApplicationException 예외를 throw하는 인스턴스가 비현실적이거나 불가능합니다. 예를 들어 가능한 모든 예외를 catch한 다음 WebApplicationException을 생성하지 않을 수 있습니다. 애플리케이션 코드를 더 쉽게 작업할 수 있는 사용자 지정 예외를 사용할 수도 있습니다.
이러한 경우를 처리하기 위해 Cryostat-RS API를 사용하면 클라이언트에 보낼 Response
오브젝트를 생성하는 사용자 정의 예외 공급자를 구현할 수 있습니다. 사용자 정의 예외 공급자는 ExceptionMapper<E> 인터페이스를 구현하여 생성됩니다. Apache CXF 런타임으로 등록하면 E
유형의 예외가 발생할 때마다 사용자 지정 공급자가 사용됩니다.
50.4.2. 예외 매퍼를 선택하는 방법
예외 매퍼는 다음 두 가지 경우에 사용됩니다.
- 예외 또는 해당 하위 클래스 중 하나가 throw되면 런타임에서 적절한 예외 매퍼를 확인합니다. throw된 특정 예외를 처리하는 경우 예외 매퍼가 선택됩니다. throw된 특정 예외에 대한 예외 매퍼가 없는 경우 예외의 가장 가까운 슈퍼 클래스의 예외 매퍼가 선택됩니다.
기본적으로 WebApplicationException은 기본 매퍼인
WebApplicationExceptionMapper
에서 처리합니다. WebApplicationException 예외(예: 사용자 지정RuntimeException
매퍼)를 처리할 수 있는 추가 사용자 지정 매퍼가 등록되더라도 사용자 지정 매퍼가 사용되지 않고WebApplicationExceptionMapper
가 대신 사용됩니다.그러나 이 동작은
Message
오브젝트에서default.wae.mapper.least.specific
속성을true
로 설정하여 변경할 수 있습니다. 이 옵션을 활성화하면 기본WebApplicationExceptionMapper
가 가장 낮은 우선 순위로 대체되므로 사용자 정의 예외 매퍼를 사용하여 WebApplicationException 예외를 처리할 수 있습니다. 예를 들어 이 옵션이 활성화된 경우 사용자 지정RuntimeException
매퍼를 등록하여 WebApplicationException 예외를 catch할 수 있습니다. “WebApplicationException의 예외 매퍼 등록”을 참조하십시오.
예외에 대한 예외 매퍼가 없으면 예외가 ServletException 예외로 래핑되고 컨테이너 런타임으로 전달됩니다. 그러면 컨테이너 런타임에서 예외를 처리하는 방법을 결정합니다.
50.4.3. 예외 매퍼 구현
예외 매퍼는 javax.ws.rs.ext.ExceptionMapper<E> 인터페이스를 구현하여 생성됩니다. 예 50.5. “예외 매퍼 인터페이스” 에 표시된 대로 인터페이스에는 원래 예외를 매개변수로 사용하고 Response
오브젝트를 반환하는 단일 메서드 toResponse()
가 있습니다.
예 50.5. 예외 매퍼 인터페이스
public interface ExceptionMapper<E extends java.lang.Throwable> { public Response toResponse(E exception); }
예외 매퍼에서 생성한 Response
오브젝트는 다른 Response
오브젝트와 마찬가지로 런타임에서 처리합니다. 소비자에 대한 결과 응답에는 Response
오브젝트에 캡슐화된 status, headers 및 entity 본문이 포함됩니다.
예외 매퍼 구현은 런타임의 공급자로 간주됩니다. 따라서 @Provider
주석을 사용하여 데코레이터해야 합니다.
예외 매퍼가 Response
오브젝트를 빌드하는 동안 예외가 발생하면 런타임에서 500개의 Server Error
상태로 응답을 보냅니다.
예 50.6. “예외를 응답에 매핑” Spring AccessDeniedException 예외를 가로채고 403 Forbidden
상태 및 빈 엔터티 본문으로 응답을 생성하는 예외 매퍼를 표시합니다.
예 50.6. 예외를 응답에 매핑
import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import org.springframework.security.AccessDeniedException; @Provider public class SecurityExceptionMapper implements ExceptionMapper<AccessDeniedException> { public Response toResponse(AccessDeniedException exception) { return Response.status(Response.Status.FORBIDDEN).build(); } }
런타임은 모든 AccessDeniedException 예외를 catch하고 엔티티 본문 없이 Response
오브젝트를 생성합니다. 403
. 그런 다음 런타임은 일반적인 응답의 경우와 같이 Response
오브젝트를 처리합니다. 결과적으로 소비자는 상태 403
으로 HTTP 응답을 수신합니다.
50.4.4. 예외 매퍼 등록
Cryostat-RS 애플리케이션에서 예외 매퍼를 사용하려면 먼저 예외 매퍼를 런타임에 등록해야 합니다. 예외 매퍼는 애플리케이션의 구성 파일에서 jaxrs:providers
요소를 사용하여 런타임과 함께 등록됩니다.
jaxrs:providers
요소는 jaxrs:server
요소의 자식이며 metrics 요소 목록을 포함합니다. 각
Cryostat
요소는 하나의 예외 매퍼를 정의합니다.
예 50.7. “런타임에 예외 매퍼 등록” 사용자 지정 예외 매퍼, SecurityExceptionMapper
를 사용하도록 구성된 Cryostat-RS 서버가 표시됩니다.
예 50.7. 런타임에 예외 매퍼 등록
<beans ...> <jaxrs:server id="customerService" address="/"> ... <jaxrs:providers> <bean id="securityException" class="com.bar.providers.SecurityExceptionMapper"/> </jaxrs:providers> </jaxrs:server> </beans>
50.4.5. WebApplicationException의 예외 매퍼 등록
이 예외 유형은 기본
에서 자동으로 처리되기 때문에 WebApplicationException 예외에 대한 예외 매퍼를 등록하는 것은 특별한 경우입니다. 일반적으로 WebApplicationException
MapperWebApplicationException
을 처리할 것으로 예상되는 사용자 정의 매퍼를 등록하더라도 기본 WebApplicationExceptionMapper
에서 계속 처리합니다. 이 기본 동작을 변경하려면 default.wae.mapper.least.specific
속성을 true
로 설정해야 합니다.
예를 들어 다음 XML 코드는 Cryostat-RS 끝점에서 default.wae.mapper.least.specific
속성을 활성화하는 방법을 보여줍니다.
<beans ...> <jaxrs:server id="customerService" address="/"> ... <jaxrs:providers> <bean id="securityException" class="com.bar.providers.SecurityExceptionMapper"/> </jaxrs:providers> <jaxrs:properties> <entry key="default.wae.mapper.least.specific" value="true"/> </jaxrs:properties> </jaxrs:server> </beans>
다음 예와 같이 인터셉터에서 default.wae.mapper.least.specific
속성을 설정할 수도 있습니다.
// Java public void handleMessage(Message message) { m.put("default.wae.mapper.least.specific", true); ...