quarkus CDI: Перехватчик не имеет привязок

#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 аннотации.