【问题标题】:Interceptors are not intercepting拦截器不拦截
【发布时间】:2013-02-15 20:04:54
【问题描述】:

我在设置 Java EE 6 CDI 拦截器时遇到问题。我正在使用嵌入式 glassfish,我在 web 应用程序的 beans.xml 中指定了拦截器。

<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>ServiceInterceptor</class>
    </interceptors>
</beans>

我正在尝试保护这个 bean:

@Named
//@Stateless
@RequestScoped
public class SecuredMethodJSFBean /*implements Serializable*/{
    @Inject
    protected SecuredMethodSample securedMethodSample;

    /*
    @CurrentUser
    @SessionScoped
    @Inject
    protected RuntimePrincipalAware principal;
    //protected JSFLoginBean jsfLoginBean;
    */

    public SecuredMethodJSFBean()
    {
        super();
        System.out.println("creating secured method jsf bean");
    }

    @Secured("adfadfafd")
    public void doSomething()
    {
        //System.out.println("\n\n\n\nprincipal:" + principal);
        //System.out.println("principal:" + jsfLoginBean.getPrincipal());

        //securedMethodSample.doSomething(jsfLoginBean.getPrincipal().getName());
        //return(jsfLoginBean.getPrincipal().getName());

        //securedMethodSample.doSomething(principal.getName());
        //return(principal.getName());
        //return("secured-method");

        securedMethodSample.doSomething("testing ...");
    }
}

我需要做什么才能让我的拦截器运行?

另外,我正在尝试使用拦截器来拦截 servlet 使用的 bean 上的方法调用。由于那些豆子是豆子,我应该能够拦截它们。但是,我无法这样做。我最初试图直接拦截 servlet 中的方法调用,但它们不是 CDI bean,所以这没有意义。

谢谢,

沃尔特

【问题讨论】:

  • 这是 beans.xml 中拦截器的完全量化名称吗? @Secured 注解是否定义为拦截器?
  • 我出于其他原因删除了完全限定名称,但是是的,容器确实看到了这个文件并解析了该行。如果我输入一些虚假的东西,它会引发错误。
  • 如何获得该 bean 的实例?
  • 你指的是什么bean?我注释掉了拦截器中的所有注入代码,现在应该没有依赖了。
  • 我们在询问 SecuredMethodJSFBean。基本上,看到可能的原因可能是 SecuredMethodJSFBean bean = new SecuredMethodJSFBean ();

标签: java-ee-6 cdi interceptor


【解决方案1】:

“我已经在web应用的beans.xml中指定了拦截器”

@Secured 是否在另一个项目/jar 中定义?在这种情况下,您需要在该 beans.xml 中启用它。

【讨论】:

  • 是的,它在另一个项目/jar中。是的,我在那里启用了它。我认为这是 Glassfish 3.x 的一个错误。
【解决方案2】:

为了更好地回答我的问题,我做了以下操作:

  1. 我创建了项目 ejb 而不是 jar(在 maven 中)。
  2. 我创建了一个 ejb-jar.xml 文件来指定/声明我的拦截器 (src/main/resources/META-INF)。
  3. 在使用此拦截器的项目中,我将类型指定为 ejb,以便它可以正确拾取它。

沃尔特

【讨论】:

    猜你喜欢
    • 2015-11-22
    • 2013-06-25
    • 2018-08-09
    • 2023-03-13
    • 2014-03-10
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多