Bean Validation (JSR-303) – 3/3 Ausblicke +

Im letzten Teil der Blog-Einträge zur JSR-303 möchte ich einige Ideen für Integrationsmöglichkeiten vorstellen, die sich durch die Verwendung von Metadaten ergeben sowie einen Ausblick auf die kommende erste offizielle Referenzimplementierung geben.

Beispiel 1: Verwendung im AJAX-Layer

Um auf die Metadaten außerhalb von Java im JavaScript einer AJAX-GUI zugreifen zu können, wird aus den MetaBeans ein JSON-String erzeugt, den ein Servlet zurückgeben kann:

public void service( HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/javascript");
JSONGenerator jsonGenerator = new JSONGenerator();
PrintWriter writer = res.getWriter();
try {
String output = jsonGenerator.toJSON(manager.findAll().values());
writer.write(output);
} catch (Exception e) {
throw new ServletException("error creating JSON for metaBeans", e);
}
}

Dabei werden auch die Typinformationen von Java nach JSON übertragen, da diese ansonsten verloren gingen. Die Beans selbst überträgt das AJAX-Framework DWR, was nicht Gegenstand dieses Eintrages ist.

Beispiel 2: Verwendung im Webservice-Layer

Eine weitere Einsatzmöglichkeit stellt sich bei Validierung eingehender Objekte eines Webservice. Am Beispiel der Webservice Frameworks XFire oder CXF kann eine eigene Invoker-Implementierung konfiguriert werden, welche die eingehenden Beans validiert. Die zu validierenden Methoden und Parameter werden durch die Annotation @Validate gekennzeichnet.

Auszug aus einem Webservice-Interface:
@Validate
void save(@Validate Address address) throws ValidationException;

Entdeckte ConstraintViolations können der Exception mitgegeben werden.

Im Invoker wird das Validierungsframework aufgerufen (Beispiel für XFire):

public Object invoke(Method m, Object[] params, MessageContext context) throws XFireFault {
BeanValidator validator = new BeanValidator();
ValidationResults results = validator.validateCall( m, params);
if (results != null && !results.isEmpty()) {
throw new XFireFault(new ValidationException(results), XFireFault.RECEIVER);
}
return super.invoke( m, params, context);
}

Die zugehörige Konfiguration für XFire sieht dabei so aus:
<beans>
<bean id="TxInvoker" class="com.example.xfire.TransactionalInvoker"
scope="prototype"/>


<service xmlns="http://xfire.codehaus.org/config/1.0">
<name>ExampleService</name>
<serviceClass>com.example.service.ExampleService</serviceClass>
<implementationClass>com.example.service.ExampleServiceImpl</implementationClass>
<serviceFactory>jsr181</serviceFactory>
<invoker>#TxInvoker</invoker>
</service>
</beans>

Weitere Anwendungsmöglichkeiten sind die Visualisierung der Pflichtfelder und Validierungsfehler in Swing-GUIs oder einem Webformular.

Ausblick

Seit Oktober 2008 entsteht eine Referenzimplementierung, die sich an Hibernate-Validator orientiert. Von der veröffentlichten Draft-Spec des JSR-303
wurde dabei in den letzten Monaten mehrfach massiv abgewichen, um neue Features und Anregungen, die von der Java-Community eingegangen sind, einzubeziehen. Das agimatec-validation framework implementiert den jeweils aktuellen Stand der APIs möglichst zeitnah und vollständig. Wir gehen davon aus, dass sich bis zum offiziellen 1.0 Release des Standards noch mehrfach einiges ändern wird, da die Referenzimplementierung noch unvollständig ist.

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>