© Excellent backgrounds/Shutterstock.com
Java Magazin
Kolumne: EnterpriseTales

Alles valide? Bean Validation in POJOs mittels aspektorientierter Programmierung

Wir berichteten im Rahmen dieser Kolumne bereits über die Neuerungen von Bean Validation 1.1. Besonders erwähnenswert war und ist dabei das neue Feature der Method Validation. Leider ist die Integration dieses Features noch nicht sehr weit vorangeschritten. Bisher ist es nur bei CDI-Beans möglich, sich darauf zu verlassen, dass z. B. ein Parameter, der mit @NotNull annotiert ist, auch wirklich niemals null ist. In allen anderen Situationen hilft es normalerweise nur, die Method Validation aus dem Code heraus „von Hand“ aufzurufen. In dieser Kolumne wollen wir eine alternative Möglichkeit vorstellen. Damit ist es möglich, in beliebigen POJOs auf Method Validation zu setzen.

Arne Limburg, Lars Röwekamp


Bean Validation ist der Java-EE-Standard für schichtenübergreifende Validierung [1]. Er kann verwendet werden, wenn es darum geht, Property Constraints per Annotations zu definieren und deren Einhaltung automatisch sicherzustellen. Das Sicherstellen der Einhaltung übernehmen dabei integrierende Standards wie JSF und JPA, die auf Bean Validation aufsetzen und zu geeigneten Zeitpunkten annotierte Java-Objekte validieren und gegebenenfalls auf Constraint-Verletzungen reagieren. Bei JSF geschieht das in der Process-Validation-Phase, bei JPA in der Regel beim Transaktions-Commit. Das führt bei korrekter Konfiguration dazu, dass fehlerhafte Daten via JSF gar nicht erst eingegeben werden können, und wenn doch, wird durch den Check von JPA dennoch sichergestellt, dass diese auf keinen Fall in der Datenbank landen.Für die Dinge, die zwischen Dateneingabe und Datenspeicherung passieren, also für die Businesslogik, gab es in Bean Validation 1.0 allerdings keine Möglichkeit, diese Checks automatisiert durchzuführen. Das hat sich mit Bean Validation 1.1 geändert. Mit dieser Version des Standards wurde die Method Validation eingeführt, die es ermöglicht, Methoden und Parameter mit Con­straint Annotations zu versehen [2]. Das ermöglicht es auch anderen Standards wie CDI und JAX-RS, leicht auf Bean Validation zu setzen. Seit Bean Validation 1.1 und JAX-RS 2.0 geschieht das auch: Annotiert man z. B. einen Parameter einer CDI-Bean oder einer JAX-RS-Ressource mit @NotNull, gibt es automatisch eine entsprechende Fehlermeldung.Bean Validation in POJOsListing 1 Method getMethod(Object object, String methodName, Object... arguments) { Class>[] argumentTypes = Arrays.asList(arguments).stream() .map(p -> p != null? p.getClass(): p).toArray(size -> new Class[size]); return getMethod(object.getClass(), methodName, argumentTypes); }  Method getMethod(Class> type, String methodName, Class>[] argumentTypes) { if (type == null) { throw new IllegalArgumentException("Method " + methodName + " not found"); } Optional method = Arrays.asList(type.getDeclaredMethods()).stream() .filter(m -> m.getName().equals(methodName)) .filter(m -> areAssignable(m.getParameterTypes(), argumentTypes)) .findFirst(); if (method.isPresent()) { return method.get(); } else { return getMethod(type.getSuperclass(), methodName, argumentTypes); } } boolean areAssignable(Class>[] parameterTypes, Class>[] argumentTypes) { if (par...

Java Magazin
Kolumne: EnterpriseTales

Alles valide? Bean Validation in POJOs mittels aspektorientierter Programmierung

Wir berichteten im Rahmen dieser Kolumne bereits über die Neuerungen von Bean Validation 1.1. Besonders erwähnenswert war und ist dabei das neue Feature der Method Validation. Leider ist die Integration dieses Features noch nicht sehr weit vorangeschritten. Bisher ist es nur bei CDI-Beans möglich, sich darauf zu verlassen, dass z. B. ein Parameter, der mit @NotNull annotiert ist, auch wirklich niemals null ist. In allen anderen Situationen hilft es normalerweise nur, die Method Validation aus dem Code heraus „von Hand“ aufzurufen. In dieser Kolumne wollen wir eine alternative Möglichkeit vorstellen. Damit ist es möglich, in beliebigen POJOs auf Method Validation zu setzen.

Arne Limburg, Lars Röwekamp


Bean Validation ist der Java-EE-Standard für schichtenübergreifende Validierung [1]. Er kann verwendet werden, wenn es darum geht, Property Constraints per Annotations zu definieren und deren Einhaltung automatisch sicherzustellen. Das Sicherstellen der Einhaltung übernehmen dabei integrierende Standards wie JSF und JPA, die auf Bean Validation aufsetzen und zu geeigneten Zeitpunkten annotierte Java-Objekte validieren und gegebenenfalls auf Constraint-Verletzungen reagieren. Bei JSF geschieht das in der Process-Validation-Phase, bei JPA in der Regel beim Transaktions-Commit. Das führt bei korrekter Konfiguration dazu, dass fehlerhafte Daten via JSF gar nicht erst eingegeben werden können, und wenn doch, wird durch den Check von JPA dennoch sichergestellt, dass diese auf keinen Fall in der Datenbank landen.Für die Dinge, die zwischen Dateneingabe und Datenspeicherung passieren, also für die Businesslogik, gab es in Bean Validation 1.0 allerdings keine Möglichkeit, diese Checks automatisiert durchzuführen. Das hat sich mit Bean Validation 1.1 geändert. Mit dieser Version des Standards wurde die Method Validation eingeführt, die es ermöglicht, Methoden und Parameter mit Con­straint Annotations zu versehen [2]. Das ermöglicht es auch anderen Standards wie CDI und JAX-RS, leicht auf Bean Validation zu setzen. Seit Bean Validation 1.1 und JAX-RS 2.0 geschieht das auch: Annotiert man z. B. einen Parameter einer CDI-Bean oder einer JAX-RS-Ressource mit @NotNull, gibt es automatisch eine entsprechende Fehlermeldung.Bean Validation in POJOsListing 1 Method getMethod(Object object, String methodName, Object... arguments) { Class>[] argumentTypes = Arrays.asList(arguments).stream() .map(p -> p != null? p.getClass(): p).toArray(size -> new Class[size]); return getMethod(object.getClass(), methodName, argumentTypes); }  Method getMethod(Class> type, String methodName, Class>[] argumentTypes) { if (type == null) { throw new IllegalArgumentException("Method " + methodName + " not found"); } Optional method = Arrays.asList(type.getDeclaredMethods()).stream() .filter(m -> m.getName().equals(methodName)) .filter(m -> areAssignable(m.getParameterTypes(), argumentTypes)) .findFirst(); if (method.isPresent()) { return method.get(); } else { return getMethod(type.getSuperclass(), methodName, argumentTypes); } } boolean areAssignable(Class>[] parameterTypes, Class>[] argumentTypes) { if (par...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang