Получите работающие перехватчики Java EE 6 (Weld на GlassFish 3.1) - PullRequest
2 голосов
/ 04 апреля 2011

Я работаю над проектом, в котором я хочу использовать Interceptors для регистрации использования ManagedBean. Как я читал в спецификациях и во многих примерах, это должно быть возможно с текущими реализациями CDI. Код в основном скопирован из примеров, таких как GlassEE JavaEE Tutorial или других источников, которые я нашел в Интернете. В этом нет особой реализации. Это должно только войти.

Я попробовал следующее:

LoggedInterceptor.java

package test.interceptors;

import java.io.Serializable;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;

@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {
    private static final long serialVersionUID = 1L;

    public LoggedInterceptor() {
    }

    @AroundInvoke
    public Object logMethodEntry(InvocationContext invocationContext)
        throws Exception {
        System.out.println(
                "Entering method: " + invocationContext.getMethod().getName()
                + " in class "
                + invocationContext.getMethod().getDeclaringClass().getName());

        return invocationContext.proceed();
    }
}

Logged.java

package test.interceptors;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({
    METHOD,
    TYPE
})
public @interface Logged {
}

WEB-INF / beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans 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/beans_1_0.xsd">
    <interceptors>
        <class>test.interceptors.LoggedInterceptor</class>
    </interceptors>
</beans>

MainController.class

// ... All imports
@Named
@SessionScoped
@Logged
public class MainController implements Serializable {
  // Code goes here
}

Я получаю исключение класса не найден из загрузчика ресурсов WELD.

    [#|2011-04-04T14:03:37.394+0200|SEVERE|glassfish3.1|javax.enterprise.system.tools.admin.org.glassfish.deployment.admin|_ThreadID=31;_ThreadName=Thread-1;|Exception while loading the app : Error loading class test.interceptors.LoggedInterceptor                                                         
    org.jboss.weld.resources.spi.ResourceLoadingException: Error loading class test.interceptors.LoggedInterceptor                                                                                        
            at org.jboss.weld.resources.DefaultResourceLoader.classForName(DefaultResourceLoader.java:61)                                                                                                                   
            at org.jboss.weld.manager.Enabled$ClassLoader.apply(Enabled.java:67)                                                                                                                                            
            at org.jboss.weld.manager.Enabled$ClassLoader.apply(Enabled.java:55)                                                                                                                                            
            at com.google.common.collect.Lists$TransformingRandomAccessList.get(Lists.java:435)                                                                                                                             
            at java.util.AbstractList$Itr.next(AbstractList.java:345)                                                                                                                                                       
            at org.jboss.weld.manager.Enabled.createMetadataMap(Enabled.java:130)                                                                                                                                           
            at org.jboss.weld.manager.Enabled.<init>(Enabled.java:100)                                                                                                                                                      
            at org.jboss.weld.manager.Enabled.of(Enabled.java:82)                                                                                                                                                           
            at org.jboss.weld.bootstrap.BeanDeployment.<init>(BeanDeployment.java:104)                                                                                                                                      
            at org.jboss.weld.bootstrap.WeldBootstrap$DeploymentVisitor.visit(WeldBootstrap.java:185)                                                                                                                       
            at org.jboss.weld.bootstrap.WeldBootstrap$DeploymentVisitor.visit(WeldBootstrap.java:156)                                                                                                                       
            at org.jboss.weld.bootstrap.WeldBootstrap.startContainer(WeldBootstrap.java:287)                                                                                                                                
            at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:167)                                                                                                                                                 
            at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)                                                                                                                                              
            at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:262)                                                                                                                                   
            at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)                                                                                                                      
            at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)                                                                                                                      
            at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)                                                                                                                                 
            at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)                                                                                                                          
            at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)                                                                                                                          
            at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)                                                                                                                         
            at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)                                                                                                                         
            at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)                                                                                                          
            at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)                                                                                                          
            at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465)                                                                                                                                    
            at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222)                                                                                                                                      
            at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)                                                                                                                                   
            at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)                                                                                                                                   
            at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)                                                                                                                        
            at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)                                                                                                                                     
            at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)                                                                                                                                         
            at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)                                                                                                                                          
            at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)                                                                                                                           
            at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)                                                                                                                    
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)                                                                                                                                  
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)                                                                                                                                   
            at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)                                                                                                                                    
            at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)                                                                                                                            
            at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)                                                                                                                                
            at com.sun.grizzly.ContextTask.run(ContextTask.java:71)                                                                                                                                                         
            at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)                                                                                                                           
            at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)                                                                                                                              
            at java.lang.Thread.run(Thread.java:619)                                                                                                                                                                        
    Caused by: java.lang.ClassNotFoundException: test.interceptors.LoggedInterceptor                                                                                                                      
            at com.sun.enterprise.loader.ASURLClassLoader.findClassData(ASURLClassLoader.java:808)                                                                                                                          
            at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:696)                                                                                                                              
            at java.lang.ClassLoader.loadClass(ClassLoader.java:307)                                                                                                                                                        
            at java.lang.ClassLoader.loadClass(ClassLoader.java:252)                                                                                                                                                        
            at org.jboss.weld.resources.DefaultResourceLoader.classForName(DefaultResourceLoader.java:52)                                                                                                                   
            ... 42 more

1 Ответ

2 голосов
/ 05 апреля 2011

Хорошие новости (ну вроде) - ваш код работает на моей машине как чудо (GlassFish 3.1, с Netbeans 7.0 RC1).

Вот что я сделал:

  • Создан новый проект Java EE в Netbeans (с модулем войны)
  • Добавлена ​​поддержка CDI / JSF 2
  • Использованы ваши классы (все в войне)
  • Заполнен MainControllerс чем-то регистрируемым

package test.web;

import java.io.Serializable;импорт java.util.Date;import javax.enterprise.context.SessionScoped;импорт javax.inject.Named;import test.interceptors.Logged;

@Named
@Logged
@SessionScoped
public class MainController implements Serializable {
    public void callMe() {
        System.out.println("called at " + new Date());
    }
}
  • Добавлена ​​тривиальная страница JSF

    <h:form>
        <h:outputText value="hallo" />
        <h:commandButton action="#{mainController.callMe}" label="jo" />
    </h:form>
    
  • Нажата кнопка и проверен вывод;-)

ИНФОРМАЦИЯ: Метод ввода: callMe в классе test.web.MainController ИНФОРМАЦИЯ: вызывается во вторник 05 апреля 13:41:41 CEST 2011

Вот и все.Похоже, проблема в настройке вашего проекта - возможно, вы захотите начать заново с нового проекта ...?

...