2013-07-10 4 views
1

У меня есть класс, который используется только при необходимости, загружается динамически, когда доступна какая-либо другая зависимость.CDI: аннотация для исключения класса из сканирования

Но CDI (Weld) сканирует его и сообщает об уродливой ошибке, см. Ниже.

Как я могу избавиться от него, в идеале используя некоторые аннотации?

Registered contexts: [interface javax.enterprise.context.RequestScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.SessionScoped, interface javax.inject.Singleton] 
Registered beans: 0 
: [<class>org.jboss.weld.environment.se.jpa.JpaTransactionInterceptor</class> in jar:file:/home/ondra/.m2/repository/org/jboss/jawabot/JawaBot-core/2.0.0.GA-SNAPSHOT/JawaBot-core-2.0.0.GA-SNAPSHOT.jar!/META-INF/[email protected]] 
10:45:12.713 INFO [main] org.jboss.weld.ClassLoading WELD-000119 Not generating any bean definitions from org.jboss.jawabot.plugin.jira.tools.ProjectsListDownloader because of underlying class loading error 
10:45:12.714 INFO [main] org.jboss.weld.ClassLoading catching 
org.jboss.weld.resources.spi.ResourceLoadingException: java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONException 
    at org.jboss.weld.environment.se.discovery.url.WeldSEResourceLoader.classForName(WeldSEResourceLoader.java:61) 
    at org.jboss.weld.bootstrap.BeanDeployer.loadClass(BeanDeployer.java:107) 
    at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:77) 
    at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:135) 
    at org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:184) 
    at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:349) 
    at org.jboss.weld.bootstrap.api.helpers.ForwardingBootstrap.deployBeans(ForwardingBootstrap.java:70) 
    at org.jboss.weld.environment.se.Weld.initialize(Weld.java:133) 
    at org.jboss.jawabot.JawaBotApp.main(JawaBotApp.java:74) 
Caused by: java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONException 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) 
    at java.lang.Class.getDeclaredMethods(Class.java:1810) 
    at org.jboss.weld.environment.se.discovery.url.WeldSEResourceLoader.classForName(WeldSEResourceLoader.java:54) 
    ... 8 more 
Caused by: java.lang.ClassNotFoundException: org.codehaus.jettison.json.JSONException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 12 more 
10:45:12.931 WARN [main] org.jboss.weld.interceptor.util.InterceptionTypeRegistry Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled 
10:45:12.931 WARN [main] org.jboss.weld.interceptor.util.InterceptionTypeRegistry Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled 
10:45:12.955 DEBUG [main] org.jboss.weld.Bootstrap WELD-000108 Decorator: Decorator [class org.jboss.weld.environment.se.threading.RunnableDecorator] decorates [Runnable] with delegate type [Runnable] and delegate qualifiers [@Default] 
10:45:12.956 DEBUG [main] org.jboss.weld.Bootstrap WELD-000107 Interceptor: Interceptor [class org.jboss.weld.environment.se.jpa.JpaTransactionInterceptor intercepts @JpaTransactional] 

ответ

2

Там нет аннотаций, чтобы сделать это из коробки, но Apache Deltaspike и некоторые другие обеспечивают @Veto.

Вместо добавления зависимости можно просто сделать простое расширение CDI, который будет накладывать вето на ваш тип, что-то вроде этого:

public class VetoExtension implements Extension { 

    public void vetoMyType(@Observes ProcessAnnotatedType<YourTypeGoesHere> pat) { 
     pat.veto(); 
    } 

} 

Вы можете увидеть это более в и конкретный пример: CDI Portable Extensions

В соответствии с комментарием @ LightGuard ниже, в CDI 1.1 это будет доступно из коробки с @Vetoed

+0

Правильно, я посмотрел на @Vetoed, но мое приложение не работало с Weld 2.x, может быть, я посмотрю в него, исправить и использовать это. –

Смежные вопросы