GEDOPLAN
QuarkusApplication ServerJakarta EE (Java EE)

Interceptor, this und Quarkus

QuarkusApplication ServerJakarta EE (Java EE)
interceptor png

Hmmm, komischer Titel, nicht wahr? Es geht um Interceptors in CDI, Methodenaufrufe im gleichen Objekt und klassische Jakarta-EE-Deployments wie auch Quarkus-Anwendungen.

Stellen wir uns einmal einen CDI Interceptor vor:

@CallLog
@Interceptor
@Priority(Interceptor.Priority.APPLICATION + 500)
public class CallLogInterceptor implements Serializable {

  @AroundInvoke
  Object traceMethod(InvocationContext invocationContext) throws Exception {

    String className = invocationContext.getMethod().getDeclaringClass().getName();
    String methodName = invocationContext.getMethod().getName();

    // Warning: Inefficient logger retrieval; use cached instances for better performance!
    Logger logger = Logger.getLogger(className);
    logger.debugf("Call %s", methodName);

    return invocationContext.proceed();
  }
}
@InterceptorBinding
@Target(TYPE)
@Retention(RUNTIME)
public @interface CallLog {
}

Mit Hilfe des Interceptor Bindings @CallLog an eine Methode einer CDI Bean gebunden, loggt der Interceptor den Methodenaufruf auf DEBUG-Level.

Nehmen wir jetzt noch eine CDI Bean, die den Interceptor nutzt:

@ApplicationScoped
@CallLog
public class ABCService {

  public void doSomething() {
    a();
    b();
    c();
  }

  public void a() {
  }

  void b() {
  }

  private void c() {
  }
}

Was ist Ihr Tipp: Für welche Methoden erhalten Sie DEBUG-Ausgaben, wenn diese Klasse bspw. in einem war-File in einen klassischen Application Server wie JBoss/WildFly deployt, die Klasse ABCService in einer anderen Bean injiziert, und darüber die Methode doSomething aufgerufen wird?

1. nur doSomething
2. alle Methoden von ABCService
3. dito, aber ohne die private Methode c

Richtig ist 1. Der Interceptor wird im klassischen System wie eine Hülle um das betroffene Objekt realisiert. Durchläuft ein Methodenaufruf diese Hülle, wird dabei der Code des Interzeptors ausgeführt.

Wenn wir nun den unveränderten Code als Teil einer Quarkus-Anwendung nutzen – ändert das das Verhalten?

Ja, nun erhalten wir DEBUG-Ausgaben für alle Methoden von ABCService mit Ausnahme der privaten Methode c!

Ich bin einigermaßen sicher, dass ein signifikanter Teil unserer JEE-Community sich gar nicht bewusst ist, dass es bei Self Calls die gezeigten Unterschiede gibt.

Ich bin mir allerdings ehrlich gesagt nicht ganz so sicher, welche Variante der CDI Specification entspricht. Die sagt im Abschnitt 1.3.6. Interceptor example: „When the ... method is invoked, the … interceptor will be called“. Das Beispiel ist jedoch zu simpel und enthält keine Selbstaufrufe. Insofern zieht sich die Spezifikation mehr oder weniger geschickt aus der Affäre.

Welche Variante würden Sie bevorzugen? Schreiben Sie gerne Ihren Kommentar unter diesen Blog Post!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.

Autor

Diesen Artikel teilen

LinkedIn
Xing

Gibt es noch Fragen?

Fragen beantworten wir sehr gerne! Schreibe uns einfach per Kontaktformular.

Kurse

weitere Blogbeiträge

IT-Training - GEDOPLAN
Java SE

Apache CompareToBuilder

Gleichheit von Objekten wird bekanntlich mittels „equals“ Methode implementiert in der fachliche Informationen heran gezogen werden um zu prüfen ob…
hypnosis 4041584 640
Webprogrammierung

Reaktive Templates in Angular

Die Arbeit mit Observables ist sicherlich täglich Brot für die meisten Angular Entwickler. Ein Template-Feature ist dabei allerdings vielen Entwicklern…

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!