使用InterceptorBinding时拦截器没有输出

问题描述 投票:0回答:1

我正在使用注释学习拦截器绑定。版本是 Java 11,Jakarta EJB 4。服务器是 GlassFish 7。没有部署描述符和注释存档所有要求。

我添加了一条打印语句来查看它是否有效。但是,服务器日志中没有任何输出。这是代码。

Auth.java

package com.aadhil.ejb.annotation;

import java.lang.annotation.*;

import jakarta.interceptor.InterceptorBinding;

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR})
public @interface Auth {
}

AuthInterceptor.java

package com.aadhil.ejb.interceptor;

import com.aadhil.ejb.annotation.Auth;
import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.Interceptor;
import jakarta.interceptor.InvocationContext;

@Auth
@Interceptor
public class AuthInterceptor {
    @AroundInvoke
    public Object authenticate(InvocationContext invocationContext) throws Exception {
        System.out.println("Auth Interceptor");
        return invocationContext.proceed();
    }
}

LoginImpl.java

package com.aadhil.ejb.impl;

import com.aadhil.ejb.annotation.Auth;
import com.aadhil.ejb.entity.User;
import com.aadhil.ejb.remote.Login;
import jakarta.ejb.Stateless;
import jakarta.persistence.EntityManager;
import jakarta.persistence.NoResultException;
import jakarta.persistence.PersistenceContext;

@Auth
@Stateless
public class LoginImpl implements Login {
    @PersistenceContext(unitName = "WebPU")
    private EntityManager em;

    @Override
    public User login(String email, String password) {
        try {
            return em.createQuery("SELECT u FROM User u WHERE u.username=:username AND u.password=:password", User.class)
                    .setParameter("username", email)
                    .setParameter("password", password)
                    .getSingleResult();
        } catch (NoResultException ex) {
            return null;
        }
    }
}

当在会话 bean 类中使用

@Interceptors
注释并在拦截器类中使用
@AroundInvoke
注释时,它工作得很好。但是,当尝试使用带有
@InterceptorBinding
注释的自定义注释类时,我看不到任何日志。我还将
@Inherited
注释添加到我的自定义注释中。但我得到了同样的结果。我的导师不使用
@Inherited
注释或任何 XML 文件来配置拦截器。

java jakarta-ee ejb interceptor
1个回答
0
投票

如评论所述,您需要在拦截器上定义

@Priority(int value)
注释。原因有点隐藏在规格中。

如果你看一下相关规范(目前是Jakarta Interceptors 2.2),第3.4章“拦截器解析”,它说:

拦截器绑定到方法或构造函数,如果:

  • [...]
  • 拦截器已启用。如果将
    Priority
    注释应用于 拦截器类。扩展规范可以定义启用拦截器的其他方法。 例如,如果拦截器类列在下面,则 CDI 规范将启用拦截器 bean 存档的
    <interceptors>
    文件的
    beans.xml
    元素。
© www.soinside.com 2019 - 2024. All rights reserved.