我正在使用注释学习拦截器绑定。版本是 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 文件来配置拦截器。
如评论所述,您需要在拦截器上定义
@Priority(int value)
注释。原因有点隐藏在规格中。
如果你看一下相关规范(目前是Jakarta Interceptors 2.2),第3.4章“拦截器解析”,它说:
拦截器绑定到方法或构造函数,如果:
- [...]
- 拦截器已启用。如果将
注释应用于 拦截器类。扩展规范可以定义启用拦截器的其他方法。 例如,如果拦截器类列在下面,则 CDI 规范将启用拦截器 bean 存档的Priority
文件的<interceptors>
元素。beans.xml