GEDOPLAN
Jakarta EE (Java EE)

CDI Interceptoren, gesprächige Service-Schicht

Jakarta EE (Java EE)
loggggs


Es gibt Momente da kann man nicht genug Informationen über den Ablauf seiner Anwendung haben, so zum Beispiel um Fehler-Situationen nach stellen zu können. Also muss ein ausführliches Logging her, am besten in der Form das wir möglichst wenig damit zu tun haben.

loggggs

Für diesen Fall bieten sich CDI Interceptoren an. Ein CDI Interceptor ist im Grunde eine einfache Methode die mittels Annotationen registriert werden kann und so Aufrufe von anderen Methoden umschließ. Mit diesem Vorgehen lässt sich sehr einfach ein entsprechendes Logging implementieren. Die Aktivierung eines solchen Loggings kann dann z.B. über eine entsprechende Logger-Kategorie geschehen (Vorteil: zur Laufzeit lässt sich diese Anpassen) oder (ohnehin Verpflichtend) über den Eintrag in der beans.xml realisiert werden. Auch wäre es denkbar solche Log-Informationen nur im Fehlerfall auszugeben. Was im Detail geloggt werden soll ist sicherlich immer Ansichtssache und unterscheidet sich je nach Art der Anwendung. Hier ein kurzes Beispiel wie so etwas aussehen könnte und die Ausgabe von Klasseninformationen( Klasse, Methode, Parameter), technischem HTTP-Context (IP Adresse, HTTP Headers) und zusätzlicher Debug Informationen über Annotations-Parameter

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

   @Nonbinding String message() default "";
}

Interceptor Binding

@Interceptor
@Debug
public class DebugInterceptor implements Serializable {

    @AroundInvoke
    public Object debug(InvocationContext ctx) throws Exception {
        String debugMessage = ctx.getMethod().getAnnotation(Debug.class).message();
        this.logRuntimeInformation(ctx, Level.FINE, debugMessage);
        return ctx.proceed();
    }

    private void logRuntimeInformation(InvocationContext ctx, Level level, String message) {
        String targetClass = ctx.getTarget().getClass().getSuperclass().getName();
        String targetMethod = ctx.getMethod().getName();
        String parameters = Stream.of(ctx.getParameters()).map(Object::toString).collect(Collectors.joining(", "));

        String remoteAddr;
        String headers;
        if (httpRequest != null) {
            remoteAddr = httpRequest.getRemoteAddr();
            headers = Collections.list(httpRequest.getHeaderNames()).stream().map((key) -> key + ":" + httpRequest.getHeader(key)).collect(Collectors.joining(", "));
        } else {
            remoteAddr = "unknown";
            headers = "undefined";
        }

        this.logger.log(level, String.format("Call of: %s#%s (%s) with parameters: [%s] from client %s (Headers: [%s])", targetClass, targetMethod, message, parameters, remoteAddr, headers));
    }

}

Implementierung

@ApplicationScoped
public class HelloWorldService implements Serializable{

    @Debug(message="Abruf formatiertes Datum")
    public String getFormattedDate(String format) {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));
    }

    @Debug(message="Produziere einen Fehler")
    public String getSomeError(String msg) {
        return String.format("%s %d", msg, "World");
    }
}

Verwendung

 

Live? In Farbe? github !

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

tunnel 4427609 1280 jpg
Webprogrammierung

Angular, Service Providers

Wer schon etwas länger im Team “Angular” spielt, wird sich noch daran erinnern, dass zu früheren Tagen alle Services im…

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!