애플리케이션 예외

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

애플리케이션 예외 정의

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

메소드의 throw 절에서 애플리케이션 예외를 정의할 수 있습니다. 애플리케이션 예외를 정의하기 위해 사용하는 메소드는 엔터프라이즈 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™ 빈에서 3.0 사양, @ApplicationException 주석에는 롤백의 선택적 매개변수가 하나만 있었습니다. 해당 애플리케이션 예외 요소의 유일한 선택적 하위 요소는 롤백이며, true 또는 false로 설정할 수 있습니다. rollback 매개변수/하위 요소는 트랜잭션이 롤백을 위해 표시되는지를 지정하는 데 사용합니다. 기본적으로 이 값은 false입니다. 애플리케이션 예외의 상속은 지정할 수 없으며 EJB 3.0 스펙에서 명시적인 기본값이 제공되지 않았습니다. EJB 3.0 스펙의 제품 구현은 Bean의 비즈니스 메소드의 throws 절에 애플리케이션 예외가 정의되지 않은 한 애플리케이션 예외 상속을 제공하지 않습니다. 반대로 EJB 3.1 스펙은 선택적 inherited 매개변수를 @ApplicationException 어노테이션에 도입하고 선택적 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는 애플리케이션 예외가 아닙니다.
기억하다: 당신은 사용할 수 있습니다 롤백 그리고 물려받은 하위 요소 적용 예외 명시적으로 재정의하려면 롤백 그리고 물려받은 에 의해 지정되거나 암시적으로 설정된 속성 값 @ApplicationException 주석.

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

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

기존 EJB 3.0 애플리케이션이 있고 애플리케이션 예외 상속 동작을 false로 유지하려는 경우, 즉 애플리케이션 예외의 서브클래스가 애플리케이션 예외가 아닌 경우 다음과 같은 옵션이 있습니다.
  • inherited 속성을 추가하고 false로 설정하여 예외의 @ApplicationException 어노테이션을 수정할 수 있습니다.
  • 버전을 추가할 수 있습니다. 3.1 배포 설명자를 명시적으로 설정하고inherited하위 요소application-exception요소false. 기존 버전이 있는 경우 3.0 버전으로 마이그레이션해야 하는 배포 설명자 3.1 배포 설명자와 XSD 스키마를 설정하고 애플리케이션 예외의 상속된 하위 요소 요소 거짓.

어노테이션을 사용하여 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> 

다음을 포함하도록 코드를 수정해야 합니다.inherited다음으로 설정된 요소false버전으로 마이그레이션할 수도 있습니다. 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>