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 Mapper 에서 자동으로 처리되기 때문에 WebApplicationException 예외에 대한 예외 매퍼를 등록하는 것은 특별한 경우입니다. 일반적으로 WebApplicationException 을 처리할 것으로 예상되는 사용자 정의 매퍼를 등록하더라도 기본 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);
    ...
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.