#java #cdi #interceptor #quarkus
Вопрос:
Я строго следую учебнику здесь (https://quarkus.io/guides/cdi#interceptors), и написать простой перехватчик на основе этого мини-примера (https://github.com/quarkusio/quarkus-quickstarts/tree/main/getting-started)
мой перехватчик:
package org.acme.getting.started;
import javax.annotation.Priority;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
@Logged
@Priority(2020)
@Interceptor
public class InvocationLogger {
@AroundInvoke
Object logInvocation(InvocationContext context) {
System.out.println("Entering method:" context.getMethod().getName());
try {
Object ret = context.proceed();
return ret;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
привязка аннотации:
package org.acme.getting.started;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;;
@Retention(value = RUNTIME)
@Target(value = { METHOD, TYPE })
public @interface Logged {
}
сервис, который я пытался привязать:
package org.acme.getting.started;
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class GreetingService {
@Logged
public String greeting(String name) {
return "hello " name;
}
}
Но у меня есть Interceptor has no bindings
ошибка:
Caused by: javax.enterprise.inject.spi.DefinitionException: Interceptor has no bindings: org.acme.getting.started.InvocationLogger
at io.quarkus.arc.processor.Interceptors.createInterceptor(Interceptors.java:44)
at io.quarkus.arc.processor.BeanDeployment.findInterceptors(BeanDeployment.java:1112)
at io.quarkus.arc.processor.BeanDeployment.registerBeans(BeanDeployment.java:233)
at io.quarkus.arc.processor.BeanProcessor.registerBeans(BeanProcessor.java:115)
at io.quarkus.arc.deployment.ArcProcessor.registerBeans(ArcProcessor.java:376)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
at java.base/java.lang.Thread.run(Thread.java:829)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Я делаю что-нибудь не так?
Комментарии:
1. Вам нужно добавить
@InterceptorBinding
вLogged
аннотацию.2. @NikosParaskevopoulos спасибо, это решило мою проблему!
3. @NikosParaskevopoulos как насчет того, чтобы добавить это в качестве ответа для будущих читателей этого вопроса?
Ответ №1:
Недостающая часть заключалась в добавлении @InterceptorBinding
аннотации к public @interface Logged
аннотации.