Remplacer la stack de stack EJBAccessException enregistrée par JBoss

J’ai un sharepoint terminaison REST dans mon application qui est protégé par la sécurité EJB.

@Path("/somepath") @Produces(MediaType.APPLICATION_JSON) @Stateless @SecurityDomain("mydomain") @RolesAllowed({"user"}) public class MyResource extends AbstractResource 

Si la session de l’utilisateur expire, web-app ne le sait pas et si j’essaie d’interagir avec elle, cela devient 403 FORBIDDEN, ce qui est complètement OK. Mais dans le journal du serveur, cette erreur ressemble à ceci:

 14:47:52,682 ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8080-5) JBAS014134: EJB Invocation failed on component MyResource for method public java.lang.Ssortingng MyResource.getSupplies(): javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public java.lang.Ssortingng MyResource.getSupplies() of bean: MyResource is not allowed at org.jboss.as.ejb3.security.AuthorizationInterceptor.processInvocation(AuthorizationInterceptor.java:101) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:76) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:32) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:173) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_55] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_55] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_55] at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_55] 

Ces messages sont si longs et si inutiles. Je veux les remplacer dans le journal par quelque chose du type “WARN: Accès non autorisé” plus peut-être des données supplémentaires, mais aucune trace de stack. Je ne sais pas comment le faire puisque ce message est enregistré par JBoss. J’apprécierais un conseil, comment puis-je atteindre le désir!

Vous devez enregistrer un ExceptionMapper auprès de RestEasy et faire ce que vous voulez dans ce gestionnaire.

ExceptionMappers sont des composants personnalisés, fournis par l’application, qui peuvent intercepter les exceptions d’application levées et écrire des réponses HTTP spécifiques.

Vous les enregistrez dans le web.xml :

  restasy.providers fully.qualified.package.to.your.CustomEJBAccessExceptionMapper  

Mes recherches ont montré qu’une solution possible consiste à utiliser les intercepteurs de conteneur qui existaient dans les versions précédentes de JBoss AS et réapparaissent dans JBoss AS 7.2. Mais il n’existe rien de tel en 7.1.1 et par coïncidence, c’est ma version de JBoss. Jusqu’à ce que mon patron décide de passer à WildFly, j’ouvre une prime au cas où quelqu’un aurait une solution alternative (NON, je ne comstackrai pas mon propre JBoss AS avec des correctifs).

Je veux les remplacer dans le journal par quelque chose comme “WARN: Accès non autorisé” plus peut-être des données supplémentaires

JBoss prend en charge les enregistreurs personnalisés. Je ne sais pas si vous pouvez configurer sa journalisation pour qu’elle affecte chaque classe, mais si cela est possible, il est naturel de régler votre journalisation (au lieu des intercepteurs, etc.)