애플리케이션 예외

애플리케이션 예외는 클라이언트에게 애플리케이션 특정 또는 비즈니스 로직 문제를 경보합니다. 시스템 레벨 예외는 보고하지 않습니다. 이 주제에는 애플리케이션 예외가 정의되는 방법에 대한 간략한 개요 및 @ApplicationException 어노테이션의 예와 해당 application-exception 배치 디스크립터 요소가 포함됩니다.

애플리케이션 예외 정의

Bean 제공자는 애플리케이션 예외와 애플리케이션 비즈니스의 로직을 같이 정의합니다. 시스템 예외와는 다르게 애플리케이션 예외는 시스템 레벨 오류 보고에는 사용되지 않습니다. 대신, 비즈니스 메소드는 애플리케이션 예외를 사용하여 클라이언트에 오류를 초래할 수 있는 애플리케이션 레벨의 활동(예: 비즈니스 메소드에 올바르지 않은 입력 인수 값)을 통지합니다. 대부분의 경우, 클라이언트는 애플리케이션 예외가 발생한 후에도 정상 처리로 돌아갈 수 있습니다.

메소드의 throws 절에 애플리케이션 예외를 정의할 수 있습니다. 애플리케이션 예외를 정의하기 위해 사용하는 메소드는 비즈니스 인터페이스, 비인터페이스 보기, 홈 인터페이스, 컴포넌트 인터페이스, 메시지 리스너 인터페이스 또는 엔터프라이즈 Bean의 웹 서비스 엔드포인트가 될 수 있습니다. 예외를 정의할 때는 애플리케이션 예외가 다음과 같을 수 있다는 점을 기억하십시오.

  • checked exception을 렌더링하는 java.lang.Exception 예외의 직접 또는 간접 서브클래스
  • unchecked exception을 렌더링하는 java.lang.RuntimeException 예외의 서브클래스
주의: java.rmi.RemoteException의 서브클래스로 애플리케이션 예외를 정의할 수 없는데 이는 이 예외와 해당 서브클래스가 시스템 레벨의 문제이기 때문입니다.

다음 표준 애플리케이션 예외와 해당 서브클래스는 클라이언트에 오류를 보고하기 위해 사용됩니다.

  • javax.ejb.CreateException
  • javax.ejb.RemoveException
  • javax.ejb.FinderException

이전 애플리케이션 예외는 EJBHome 인터페이스, EJBLocalHome 인터페이스 또는 둘 다의 작성, 제거, 파인더 메소드에 정의됩니다. 이런 인터페이스는 EJB 2.1 클라이언트 보기에 작성된 컴포넌트의 인터페이스입니다.

Enterprise Java™ Beans 3.0 스펙에서 @ApplicationException 어노테이션에는 롤백에 대해 한 개의 선택적 매개변수만 있었습니다. 해당 application-exception 요소에는 true 또는 false로 설정하는 한 개의 선택적 하위 요소인 롤백만 있었습니다. 롤백 매개변수/하위 요소는 트랜잭션이 롤백용으로 표시되는지 여부를 지정하는 데 사용됩니다. 기본적으로 이 값은 false입니다. 애플리케이션 예외 상속은 지정할 수 없으며 EJB 3.0 스펙에 명시적인 기본값을 제공하지 않았습니다. EJB 3.0 스펙의 제품 구현은 애플리케이션 예외가 Bean의 비즈니스 메소드에서 throws 절에 정의된 경우를 제외하고는 애플리케이션 예외 상속을 제공하지 않았습니다. 이와 반대로 EJB 3.1은 @ApplicationException 어노테이션에 대해 선택적 inherited 매개변수와 해당하는 application-exception 배치 디스크립터 요소에 상속적 inherited 하위 요소를 도입하였습니다. 기본적으로, 예외를 애플리케이션 예외로 표시하면 해당 예외의 모든 서브클래스도 애플리케이션 예외(즉, inherited=true)가 됩니다. @ApplicationException의 inherited 매개변수를 false로 설정하여 상속 동작이 사용되지 않도록 할 수 있습니다. 유사하게 배치 디스크립터에서 application-exception 요소의 inherited 하위 요소를 설정하여서도 상속 동작이 사용되지 않도록 할 수 있습니다. 애플리케이션 예외에 대한 자세한 정보는 EJB 3.1 스펙의 14.1.1절을 참조하십시오.

예: 어노테이션을 사용하여 상속된 애플리케이션 예외

import javax.ejb.ApplicationException;

@ApplicationException(inherited=true, rollback=true)
public class RTExceptionA extends RuntimeException{

   //RTExceptionA
   
}
public class RTExceptionB extends RTExceptionA{

   //RTExceptionB

}
import javax.ejb.ApplicationException;

@ApplicationException(inherited=false, rollback=false)
public class RTExceptionC extends RTExceptionB{

   //RTExceptionC

}
public class RTExceptionD extends RTExceptionC{

   //RTExceptionD 
   
}

이전 예는 다음과 같은 결과를 작성합니다.

  • RTExceptionA는 트랜잭션 롤백이 포함된 애플리케이션 예외입니다.
  • RTExceptionB는 트랜잭션 롤백이 포함된 애플리케이션 예외입니다.
  • RTExceptionC는 트랜잭션 롤백이 포함되지 않은 애플리케이션 예외입니다.
  • RTExceptionD는 애플리케이션 예외가 아닙니다.

예: XML을 사용하여 상속된 애플리케이션 예외

public class RTExceptionA extends RuntimeException{

   //RTExceptionA
   
}
public class RTExceptionB extends RTExceptionA{

   //RTExceptionB

}
public class RTExceptionC extends RTExceptionB{

   //RTExceptionC

}
public class RTExceptionD extends RTExceptionC{

   //RTExceptionD 
   
}
<!-- Example ejb-jar.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    metadata-complete="true" version="3.1">
    <assembly-descriptor>
        <application-exception>
            <exception-class>myXML.example.package.RTExceptionA</exception-class>
            <rollback>true</rollback>
            <inherited>true</inherited>
        </application-exception>
        <application-exception>
            <exception-class>myXML.example.package.RTExceptionC</exception-class>
            <rollback>false</rollback>
            <inherited>false</inherited>
        </application-exception>
    </assembly-descriptor>
</ejb-jar> 

어노테이션 버전에서와 같이 이전 예는 다음 결과를 작성합니다.

  • RTExceptionA는 트랜잭션 롤백이 포함된 애플리케이션 예외입니다.
  • RTExceptionB는 트랜잭션 롤백이 포함된 애플리케이션 예외입니다.
  • RTExceptionC는 트랜잭션 롤백이 포함되지 않은 애플리케이션 예외입니다.
  • RTExceptionD는 애플리케이션 예외가 아닙니다.
알아두기: application-exceptionrollbackinherited 하위 요소를 사용하여 지정된 rollbackinherited 속성을 명시적으로 대체하거나 @ApplicationException 어노테이션으로 명시적으로 설정할 수 있습니다.

Bean의 비즈니스 메소드에서 throws 절에 예외를 지정하는 경우 결과로 작성되는 검사된 예외는 애플리케이션 예외입니다. 이 애플리케이션 예외의 모든 서브클래스도 애플리케이션 예외입니다. 검사된 애플리케이션 예외에 대한 이 상속 동작이 사용되지 않도록 하는 옵션은 없습니다. inherited 요소를 사용하여 검사된 애플리케이션 예외 서브클래스의 롤백 값을 판별할 수 있습니다. 검사된 애플리케이션 예외의 inherited 요소가 true 로 설정되고 해당 rollback 요소가 true로 설정되면 검사된 해당 애플리케이션 예외의 서브클래스는 rollback = true 값을 상속합니다.

EJB 3.0 애플리케이션 예외 상속 동작 가져오기

기존의 EJB 3.0 애플리케이션이 있고 계속 애플리케이션 예외 상속 동작을 false로 설정하려는 경우, 즉 애플리케이션 예외의 서브클래스가 애플리케이션 예외 자체가 아니도록 하려는 경우에는 다음과 같은 옵션이 있습니다.
  • inherited 속성을 추가하고 이를 false로 설정하여 예외의 예외 @ApplicationException 어노테이션을 수정할 수 있습니다.
  • 버전 3.1 배치 디스크립터를 추가하고 application-exception 요소의 inherited 하위 요소를 명시적으로 false로 설정할 수 있습니다. 기존 버전 3.0 배치 디스크립터가 있는 경우 버전 3.1 배치 디스크립터와 XSD 스키마로 마이그레이션하고 inherited subelement of the application-exception 요소를 false로 설정해야 합니다.

예: 어노테이션이 포함된 EJB 3.0 애플리케이션 예외 상속 동작 가져오기

이전에 다음과 같은 코드가 있다고 가정해 보십시오.

import javax.ejb.ApplicationException;

@ApplicationException()
public class EJB30_RTException extends RuntimeException{

   //EJB30_RTException, in EJB 3.0 subclasses were not application exceptions 
   
}

@ApplicationException 어노테이션을 수정하여 inherited=false 속성을 포함해야 합니다.

import javax.ejb.ApplicationException;

@ApplicationException(inherited=false)
public class EJB30_RTException extends RuntimeException{

   //EJB30_RTException,  now you must explicitly set inherited to false to disable inheritance
   
}

예: XML을 사용하여 EJB 3.0 애플리케이션 예외 상속 동작 가져오기

이전에 다음과 같은 코드가 있다고 가정해 보십시오.

<!-- Example ejb-jar.xml -->

<?xml version="1.0" encoding="UTF-8"?>
  <ejb-jar id="ejb-jar_ID" xmlns="http://java.sun.com/xml/ns/javaee"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
      metadata-complete="true" version="3.0">
    <assembly-descriptor>
        <application-exception>
            <exception-class>myXML.example.package.EJB30_RTException</exception-class>
        </application-exception>
    </assembly-descriptor>
</ejb-jar> 

false로 설정된 inherited 요소가 추가되고 버전 3.1 배치 디스크립터 및 XSD 스키마로 마이그레이션하려면 코드를 수정해야 합니다.

<!-- Example ejb-jar.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    metadata-complete="true" version="3.1">
    <assembly-descriptor>
        <application-exception>
            <exception-class>myXML.example.package.EJB30_RTException</exception-class>
            <rollback>false</rollback>
            <inherited>false</inherited>
        </application-exception>
    </assembly-descriptor>
</ejb-jar> 

주제 유형을 표시하는 아이콘 개념 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cejb_app_exception
파일 이름:cejb_app_exception.html