【问题标题】:Get Java EE 6 interceptors working (Weld on GlassFish 3.1)让 Java EE 6 拦截器工作(在 GlassFish 3.1 上焊接)
【发布时间】:2011-07-29 03:43:43
【问题描述】:

我正在做一个项目,我想使用拦截器来记录 ManagedBean 的使用情况。正如我在规范和许多示例中阅读的那样,当前的 CDI 实现应该是可能的。代码主要是从 Glassfish JavaEE 教程等示例或我在网上找到的其他资源中复制的。其中没有特殊的实现。它应该只记录。

我尝试的是以下内容:

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

【问题讨论】:

  • 代码看起来确实不错。您能否描述一下您的部署(战争?/耳朵?/结构?)您有机会将其推送到 JBoss 6 吗?
  • @jan-groth 您好,感谢您的回复。代码被部署为一个耳朵。耳朵包括两个 EJB 罐子和一个战争文件。拦截器应该由war 文件中的ManagedBeans 使用。抱歉,Glassfish 是强制性的,没有可用的 JBoss 安装。
  • 尝试将拦截器代码移动到战争中,看看它是否仍然无法正常工作。 Weld 和 EAR 部署存在类路径问题...
  • 对不起。没有写这个。拦截器代码在 war-file 中:-(我也从 EJB-Jars 或单独的包中尝试过它。它不起作用。但是我在 ManagedBeans 中使用它的方式是正确的?

标签: jakarta-ee glassfish aop interceptor cdi


【解决方案1】:

好消息(嗯,有点) - 你的代码在我的机器上运行起来就像一个魅力(GlassFish 3.1,带有 Netbeans 7.0 RC1)。

这就是我所做的:

  • 在 Netbeans 中创建了一个新的 Java EE 项目(带有 war 模块)
  • 添加了对 CDI / JSF 2 的支持
  • 用过你的课程(都在战争中)
  • 用可记录的东西填充 MainController

打包test.web;

导入 java.io.Serializable;进口 java.util.日期;进口 javax.enterprise.context.SessionScoped; 导入 javax.inject.Named;进口 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>
    
  • 单击按钮并检查输出 ;-)

INFO: 输入方法: callMe in class test.web.MainController 信息:调用 在 2011 年 4 月 5 日星期二 13:41:41 CEST

差不多就是这样。似乎您的项目设置是问题 - 您可能想重新开始一个新项目...?

【讨论】:

  • 完美。非常感谢。下次我会在我问之前自己设置一个新的并减少到最小的项目。是的,它按预期工作。谢谢
  • 此答案中描述的“解决方案”仅适用于 EAR。如果您像最初的问题一样在 EAR 中有 JAR + WAR,它将无法以这种方式工作......
  • 所以你认为 OP 在他写道它现在对他有用时撒了谎? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2017-02-08
相关资源
最近更新 更多