Excepción del sistema o excepción de la aplicación
Pregunta
Me confunde un punto vago en la definición y el posible impacto de Application Exceptions
y System Exceptions
en EJB
.En particular, no puedo entender si la excepción se define como:
public class SomeException extends Exception{
...
}
va a ser un Application
o System Exception
.Según la especificación un Application Exception
siempre debe definirse con la anotación @ApplicationException
.Deduzco por lo tanto que la clase anterior no es una Application Exception
aunque es una excepción marcada.Mis preguntas que surgen se refieren a la sintaxis correcta de Java y, posteriormente, al comportamiento del EJB Container
en caso de que esto Exception
debe incluirse dentro de un método de negocio de un Session Bean
(no Singleton
aunque):
@Stateless
@LocalBean
public class StatelessBean{
public void doStuff(){
throw new SomeException();
}
}
1) ¿Debería el SomeException
declararse en la cláusula de lanzamiento?
2) ¿El Container
descarta la instancia después del método doStuff()
¿se llama?
3) Si finalmente es un Sytem Exception
¿Es correcta mi suposición de que un System Exception
podría ser un marcado y no RuntimeException
?
Actualizar:
En mi opinión, según la especificación no está definitivamente claro que una excepción marcada siempre deba ser una Application Exception
.¿Qué pasaría si uno definiera un marcado? RuntimeException
?¿Debería incluirse en throw
de un método?Es una System
o Application Exception
?
public class SomeException extends RuntimeException{
...
}
Solución
La especificación dice:
Las excepciones de la aplicación que se verifican las excepciones pueden definirse como tales al ser enumeradas en las cláusulas de los tiros de los métodos de la interfaz de negocios del bean, la vista de no-interfaz, la interfaz de inicio, la interfaz de componentes y el punto final del servicio web.Una excepción de la aplicación que es una excepción sin marcar se define como una excepción de la aplicación al anotarlo con la anotación de metadatos de SpelyException, o denotarla en el descriptor de implementación con el elemento de la excepción de la aplicación.
Entonces, la clase anterior es una excepción de solicitud, ya que es una excepción marcada.Y, por supuesto, se debe enumerar en la cláusula de tiros de su método, de lo contrario, el código no compilará.Y no, la instancia del frijol no se descartará después de que esta excepción sea lanzada, según la especificación.