<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>agimatec &#187; Deutsch</title>
	<atom:link href="http://www.agimatec.de/blog/category/de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agimatec.de/blog</link>
	<description>Clash of realities</description>
	<lastBuildDate>Tue, 22 Dec 2009 16:50:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Java code of the week&#8230;</title>
		<link>http://www.agimatec.de/blog/2009/06/java-code-of-the-week/</link>
		<comments>http://www.agimatec.de/blog/2009/06/java-code-of-the-week/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 08:02:03 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=633</guid>
		<description><![CDATA[private void log(String message) { Logger log = Logger.getLogger(this.getClass()); if(log.isDebugEnabled()) { if(Thread.currentThread() != null) { log.debug(Thread.currentThread().getName()  + ": " +  message); } else { log.debug(message); } } }]]></description>
			<content:encoded><![CDATA[<pre>private void log(String message) {
  Logger log = Logger.getLogger(this.getClass());
  if(log.isDebugEnabled()) {
    if(Thread.currentThread() != null) {
      log.debug(Thread.currentThread().getName()  + ": " +  message);
    } else {
      log.debug(message);
    }
  }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2009/06/java-code-of-the-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Validation (JSR-303) &#8211; 3/3 Ausblicke</title>
		<link>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-33-ausblicke/</link>
		<comments>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-33-ausblicke/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 10:01:24 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=435</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.<span id="more-435"></span></p>
<p><strong>Beispiel 1: Verwendung im AJAX-Layer</strong></p>
<p>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:</p>
<p><code>public void service(  HttpServletRequest req,  HttpServletResponse res)<br />
throws ServletException, IOException {<br />
res.setContentType("text/javascript");<br />
JSONGenerator jsonGenerator =    new JSONGenerator();<br />
PrintWriter writer = res.getWriter();<br />
try {<br />
String output = jsonGenerator.toJSON(manager.findAll().values());<br />
writer.write(output);<br />
} catch (Exception e) {<br />
throw new ServletException("error creating JSON for metaBeans", e);<br />
}<br />
}<br />
</code></p>
<p>Dabei werden auch die Typinformationen von Java nach JSON übertragen, da diese ansonsten verloren gingen. Die Beans selbst überträgt das AJAX-Framework <a href="http://getahead.org/dwr/ ">DWR</a>, was nicht Gegenstand dieses Eintrages ist.</p>
<p><strong>Beispiel 2: Verwendung im Webservice-Layer</strong></p>
<p>Eine weitere Einsatzmöglichkeit stellt sich bei  Validierung eingehender Objekte eines Webservice. Am Beispiel der Webservice Frameworks <a href="http://xfire.codehaus.org/ ">XFire oder CXF</a> kann eine eigene Invoker-Implementierung konfiguriert werden, welche die eingehenden Beans validiert. Die zu validierenden Methoden und Parameter werden durch die Annotation @Validate gekennzeichnet.</p>
<p>Auszug aus einem Webservice-Interface:<br />
<code>@Validate<br />
void save(@Validate  Address address)  throws ValidationException;<br />
</code><br />
Entdeckte ConstraintViolations können der Exception mitgegeben werden.</p>
<p>Im Invoker wird das Validierungsframework aufgerufen (Beispiel für XFire):</p>
<p><code>public Object invoke(Method m, Object[] params, MessageContext context) throws XFireFault {<br />
BeanValidator validator =     new BeanValidator();<br />
ValidationResults results =    validator.validateCall( m, params);<br />
if (results != null &amp;&amp;   !results.isEmpty()) {<br />
throw new XFireFault(new  ValidationException(results),   XFireFault.RECEIVER);<br />
}<br />
return super.invoke(  m, params, context);<br />
}<br />
</code></p>
<p>Die zugehörige Konfiguration für XFire sieht dabei so aus:<br />
<code>&lt;beans&gt;<br />
&lt;bean id="TxInvoker" class="com.example.xfire.TransactionalInvoker"<br />
scope="prototype"/&gt;<br />
</code><br />
<code><br />
&lt;service xmlns="http://xfire.codehaus.org/config/1.0"&gt;<br />
&lt;name&gt;ExampleService&lt;/name&gt;<br />
&lt;serviceClass&gt;com.example.service.ExampleService&lt;/serviceClass&gt;<br />
&lt;implementationClass&gt;com.example.service.ExampleServiceImpl&lt;/implementationClass&gt;<br />
&lt;serviceFactory&gt;jsr181&lt;/serviceFactory&gt;<br />
&lt;invoker&gt;#TxInvoker&lt;/invoker&gt;<br />
&lt;/service&gt;<br />
&lt;/beans&gt;</code></p>
<p>Weitere Anwendungsmöglichkeiten sind die Visualisierung der Pflichtfelder und Validierungsfehler in Swing-GUIs oder einem Webformular.</p>
<p><strong>Ausblick</strong></p>
<p>Seit Oktober 2008 entsteht eine <a href="http://anonsvn.jboss.org/repos/hibernate/validator/trunk/">Referenzimplementierung</a>, die sich an Hibernate-Validator orientiert. Von der  veröffentlichten <a href="http://jcp.org/aboutJava/communityprocess/edr/jsr303/">Draft-Spec des JSR-303</a><br />
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.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-33-ausblicke/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Validation (JSR-303) &#8211; 2/3 Implementierung</title>
		<link>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-23-implementierung-agimatec-validation/</link>
		<comments>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-23-implementierung-agimatec-validation/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 09:46:39 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=424</guid>
		<description><![CDATA[agimatec-validation framework Constraints in Annotations oder mit XML-Deskriptoren sind Metadaten, die den Domainklassen zusätzliche Semantik verleihen, die für diverse Verwendungszwecke mit der Constraint-Metadata-API ausgewertet werden kann. Diese Anforderung bestand auch schon vor Zeiten der JSR-303 und hat die agimatec GmbH dazu veranlasst, das Framework „agimatec-validation“ im Frühjahr 2007 zu entwickeln. Das Framework ist seither als [...]]]></description>
			<content:encoded><![CDATA[<p><strong>agimatec-validation framework<br />
</strong></p>
<p>Constraints in Annotations oder mit XML-Deskriptoren sind Metadaten, die den Domainklassen zusätzliche Semantik verleihen, die für diverse Verwendungszwecke mit der Constraint-Metadata-API ausgewertet werden kann.</p>
<p>Diese Anforderung bestand auch schon vor Zeiten der JSR-303 und hat die agimatec GmbH dazu veranlasst, das Framework „agimatec-validation“ im Frühjahr 2007 zu entwickeln. Das Framework ist seither als Basis zur Erzeugung dynamischer AJAX Oberflächen für Portlets und zur Validierung in Webservices produktiv im Einsatz.</p>
<p>Durch die konzeptionelle Nähe war es bei Erscheinen der JSR-303 möglich, das <a href="http://code.google.com/p/agimatec-validation/">agimatec-validation Framework</a> so zu erweitern, dass damit rasch die erste und bislang  vollständigste Implementierung des Specification-Draft als OpenSource veröffentlicht wurde.<span id="more-424"></span></p>
<p>Zusätzliche Anforderungen waren dabei, dass</p>
<ul>
<li>eine möglichst automatische Generierung der Metadaten als XML-Dateien erfolgt,</li>
<li>eine Klasse zur Laufzeit unterschiedliche Metadaten und Validierungsregeln besitzen kann (z.B. für rechteabhängige Validierung),</li>
<li>die „höheren“ Schichten (hier: die GUI-Schicht) die Metadaten erweitern oder selektiv überschreiben können und</li>
<li> die Metadaten den AJAX GUIs in Form von <a href="http://www.json.org/ ">JSON (JavaScript Object Notation)</a> zur Verfügung stehen sollen.</li>
</ul>
<p><strong>Generierung aus Datenbankinformationen</strong></p>
<p>Die häufigsten Metainformationen betreffen  Pflichtfelder und Feldlängen. Diese sind im Datenbankschema definiert oder durch  Annotationen der Package javax.persistence<br />
<code>@Column(nullable, length, unique) oder<br />
@JoinColumn(...)</code><br />
an den Entity-Klassen definiert. Um aus dem Datenbankschema oder den Annotationen entsprechendes XML zu generieren bieten sich die als OpenSource verfügbaren <a href="http://code.google.com/p/agimatec-tools/">agimatec-tools</a> an (oder eine MDA-Lösung).</p>
<p>Das hier gezeigte XML folgt dem agimatec-validation Framework, da die JSR-303 bislang noch keine Aussage über XML-Tags getroffen hat:</p>
<p><code>&lt;beanInfos&gt;<br />
&lt;bean id=“Address“<br />
impl=“test.jsr303.Address“&gt;<br />
&lt;property name=“line1“<br />
mandatory=“true“<br />
maxLength=“30“/&gt;<br />
&lt;property name=“line2“<br />
maxLength=“30“/&gt;<br />
&lt;property name=“zipCode“<br />
mandatory=“true“<br />
maxLength=“5“/&gt;<br />
...<br />
&lt;/bean&gt;<br />
...<br />
&lt;/beanInfos&gt;<br />
</code></p>
<p><strong>Features und Validators per XML</strong></p>
<p>Häufige Eigenschaften sind direkt als Attribut deklarierbar, sonstige Informationen werden mit &lt;feature&gt;-Tags abgelegt:</p>
<p><code><br />
&lt;feature key="readonly"&gt;<br />
&lt;value class="boolean"&gt;true&lt;/value&gt;<br />
&lt;/feature&gt;<br />
</code></p>
<p>Eigene Validator-Implementierungen werden über das &lt;validator&gt;-Tag konfiguriert:</p>
<p><code><br />
&lt;beanInfos&gt;<br />
&lt;validator id="email"<br />
java="my.own.EMailValidation"/&gt;<br />
&lt;bean id=“Customer“&gt;<br />
&lt;property name=“emailAddress“&gt;<br />
&lt;validator refId="email"/&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;/beanInfos&gt;<br />
</code></p>
<p>Nicht alle Metadaten sind zur Validierung relevant, sondern können für andere Zwecke z.B. zur Erzeugung einer Oberfläche genutzt werden. So können z.B. Feldreihenfolgen im Eingabeformular, Felder zur Darstellung in einer Tabelle oder die Properties zur Anzeige einer Beschreibung eines Objekts aus den Metadaten hervorgehen. Hier sind der Phantasie der GUI-Entwickler kaum Grenzen gesetzt.</p>
<p>Da die Metadaten aus diversen Quellen (Annotations, unterschiedlichen XML-Dateien und/oder den JDK-BeanInfos) zusammengestellt werden, können Zusatzinformationen beispielsweise in gesonderten XML-Dateien gehalten werden, während andere Informationen per Generierung zustande kommen.</p>
<p>Jede XML-Datei mit Metadaten muss  registriert werden:</p>
<p><code>MetaBeanManager manager =  new MetaBeanManager();<br />
manager.addResourceLoader("beanInfos.xml");</code></p>
<p>Auf die Metadaten einer Domainklasse kann alternativ zur Metadata-API des JSR-303 direkt über den MetaBeanManager zugegriffen werden:</p>
<p><code>MetaBean metabean =  manager.findForClass(Address.class);<br />
// oder<br />
metaBean =  manager.findForId(„Address“);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-23-implementierung-agimatec-validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Validation (JSR-303) &#8211; 1/3 Standard</title>
		<link>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-13-standard/</link>
		<comments>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-13-standard/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 09:33:21 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=409</guid>
		<description><![CDATA[Die Modellschicht ist das Kernstück der meisten Anwendungen und beeinflusst Schnittstellen, Datenbankdesign und Oberflächen. Validierungsregeln und Metadaten, die über die Typinformationen von Java hinausgehen, können mit Hilfe von Annotations oder XML, deklariert werden. Daraus ergeben sich Chancen zur Verbesserung der Konsistenzprüfungen und Verarbeitung der Modellschicht in unterschiedlichen Anwendungslayern. Neben den seit Jahren bekannten proprietären Validierungsframeworks [...]]]></description>
			<content:encoded><![CDATA[<p>Die Modellschicht ist das Kernstück der meisten Anwendungen und beeinflusst Schnittstellen, Datenbankdesign und Oberflächen. Validierungsregeln und Metadaten, die über die Typinformationen von Java hinausgehen, können mit Hilfe von Annotations oder XML, deklariert werden. Daraus ergeben sich Chancen zur Verbesserung der  Konsistenzprüfungen und Verarbeitung der Modellschicht in unterschiedlichen Anwendungslayern.</p>
<p>Neben den seit Jahren bekannten proprietären Validierungsframeworks liegt seit März 2008 mit der JSR-303 ein Spezifikationsvorschlag für eine Java API für JavaBeans vor, der zukünftige Tools und Standards beeinflussen wird.</p>
<p>In den folgenden drei Einträgen stelle ich</p>
<p>a) Grundkonzepte der JSR-303<br />
b) eine erste Implementierung des Standards<br />
und<br />
c) Beispiele für Integrationsmöglichkeiten und die Referenzimplementierung<br />
vor.<br />
<span id="more-409"></span><br />
Datenvalidierung ist eine allgemeine Aufgabe, die leider über die meisten Schichten einer Anwendung verteilt ist und dabei oftmals die Implementierung gleicher oder ähnlicher Regeln in jeder Schicht zur Folge hat. Dies führt zu doppeltem Code und Fehleranfälligkeit.</p>
<p>Für die Konsistenzprüfung umfangreicher Modelle von Businessentitäten müssen Validierungsregeln deklariert oder programmiert werden. Zu diesem Zweck gibt es seit Jahren bereits eine Vielzahl an proprietären Frameworks, einige Beispiele:</p>
<ul>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://commons.apache.org/validator/ "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Apache 	Common-Validator </span></span></a></p>
</li>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://struts.apache.org/1.2.4/userGuide/dev_validator.html "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Struts-Validation 	für Webclients und JavaScript</span></span></a></p>
</li>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://validator.hibernate.org "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Hibernate-Validator 	(mit JBoss Seam Integration) </span></span></a></p>
</li>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://www.opensymphony.com/xwork/wikidocs/Validation%20Framework.html "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">WebWork mit XWork 	Validation Framework</span></span></a></p>
</li>
</ul>
<p>Diese sind jedoch meist darauf ausgelegt, die Validierung in einer bestimmten Schicht der Anwendung abzusichern und sind sich allenfalls konzeptionell ähnlich. Einen Java-Standard für Deklaration und Prüfung von Validierungs-Constraints gab es bislang nicht.<br />
Seit März 2008 liegt mit der „JSR-303: Bean Validation“ ein erster Vorschlag für einen allgemeinen Validierungsstandard im Javaumfeld vor, der zukünftig Einfluß auf Tools, Produkte und darauf aufbauende Standards haben soll. Ziel der Spezifikation ist es, als Erweiterung des Java-Beans Objektmodells in Java EE und SE eine einheitliche API für alle Schichten, sei es die Persistence Schicht, die Web Schicht und andere GUI-Schichten (z.B. Swing), zu bieten.</p>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><strong>Grundkonzepte der Spezifikation</strong></span></span></p>
<p>Als Metamodell zur Deklaration von Constraints schlägt der <a href="http://jcp.org/aboutJava/communityprocess/edr/jsr303/">Draft der JSR-303</a> Annotationen für JavaBeans vor. Ferner wird in Aussicht gestellt, dass auch XML-Deployment-Descriptoren unterstützt werden sollen, was zum Zeitpunkt der Erstellung dieses Artikels aber noch nicht spezifiziert wurde. Alle Klassen der Spezifikation selbst werden sich im Package „javax.validation“ befinden.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><em><strong>Annotation der Domainklassen</strong></em></span></span></p>
<p>Um für die Domainklasse „Address“ festzulegen, dass die Felder „line1“ und „zipCode“ Pflichtfelder sind und die Werte eine  maximale Anzahl Zeichen nicht überschreiten dürfen, schreibt man:<br />
<code>public class Address {<br />
@NotEmpty @Length(max = 30)<br />
private String line1;<br />
@Length(max = 30)<br />
private String line2;<br />
@NotEmpty @Length(max = 5)<br />
private String zipCode;<br />
...<br />
}</code></p>
<p>Folgende Sprachkonstrukte dürfen hierzu mit Annotationen versehen werden:</p>
<ul>
<li> Instanzvariablen (field validation)</li>
<li> Getter-Methoden (method validation)</li>
<li> die Klasse selbst (bean-level constraints)</li>
<li> Superklassen und</li>
<li> Interfaces.</li>
</ul>
<p>Es ist daher auch möglich, die Klasse „Customer“ durch Annotation ihres Interfaces „Person“ mit Constraints zu versehen:</p>
<p><code>public interface Person {<br />
@NotEmpty<br />
String getFirstName();<br />
String getMiddleName();<br />
@NotEmpty<br />
String getLastName();<br />
}</code></p>
<p><code><br />
public class Customer implements Person {<br />
private String firstName;<br />
private String middleName;<br />
private String lastName;<br />
@Password(robustness = 5)<br />
private String password;<br />
...<br />
}<br />
</code></p>
<p>Alle Constraints aus Oberklassen und Interfaces werden stets vererbt. Neben den Annotationen, welche die Implementierung der Spezifikation mitbringen wird, können beliebige eigene genutzt werden.</p>
<p><strong>Eigene Constraints definieren</strong><br />
Zur Implementierung neuer Constraints müssen die entsprechende Annotation und ein  ConstraintValidator erstellt werden.<br />
Die Annotation wird im Domainmodell wie bereits dargestellt verwendet. Aufgerufen wird die Implementierung von einem Validator,  welcher darüber entscheidet ob der Constraint erfüllt ist oder nicht.</p>
<p>Dazu folgt ein Beispiel für die Annotation „Pattern“:</p>
<p><code>@Documented<br />
@Target({METHOD, FIELD})<br />
@Retention(RUNTIME)<br />
@ConstraintValidator(<br />
PatternValidator.class)</code><br />
<code><br />
public @interface Pattern {<br />
String regex();<br />
String message()<br />
default "{beancheck.pattern}";<br />
String[] groups() default {};<br />
}</code></p>
<p>Die Implementierung „PatternValidator“ soll den Wert der annotierten Property gegen den angegebenen regulären Ausdruck aus „regex“ prüfen. Der ConstraintValidator PatternValidator muss das Interface „javax.validation.Constraint“ implementieren, das die Methode<br />
<code>boolean isValid(Object value, ConstraintContext constraintContext);</code><br />
beinhaltet.</p>
<p><strong>Mehrfache Zuweisung von Constraints gleichen Typs</strong></p>
<p>Um mehrere gleiche Constraints mit unterschiedlichen Parametern für das gleiche Feld verwenden zu können, unterstützt die Spezifikation sogenannte „multi-valued constraints“.  Eine Annotation darf hierbei die eigentlichen Constraint-Annotations als Array im Feld „value“ beinhalten:</p>
<p><code>@Documented<br />
@Target({ElementType.METHOD, FIELD})<br />
@Retention(RUNTIME)<br />
public @interface Patterns {<br />
Pattern[] value();<br />
}<br />
</code></p>
<p>In der Verwendung liest sich dies dadurch folgendermaßen:<br />
<code><br />
public class Engine {<br />
@Patterns({<br />
@Pattern(regex = "^[A-Z0-9-]+$"),<br />
@Pattern(regex = "^....-....$")<br />
})<br />
protected String serialNumber;<br />
...<br />
}<br />
</code></p>
<p>Das Beispiel zeigt die Constraint-Definitionen zweier @Pattern für das Feld „serialNumber“ in einer Domainklasse namens „Engine“.</p>
<p>Für die eigentliche Validierung sieht die Spezifikation das Interface „Validator“ vor. Es definiert diverse validate*() Methoden für Objekte oder einzelne Properties, welche bei Verstoß gegen die festgelegten Validierungsregeln die Menge der entsprechenden ConstraintViolation Objekte zurückgeben:<br />
<code><br />
Validator validator = ... ;<br />
Set&lt;ConstraintViolation&lt;Address&gt;&gt;<br />
errors = validator.validate(address);</code></p>
<p><code><br />
for(ConstraintViolation each :  errors) {<br />
printInvalidContraint(<br />
each.getPropertyPath(),<br />
each.getInterpolatedMessage());<br />
}</code></p>
<p>An welcher Stelle die Validierung in eine Anwendung integriert werden kann oder sollte ist nicht Bestandteil der Spezifikation.</p>
<p>Dieser Eintrag ist sowieso schon zu lang, aber alle Features im Detail zu zeigen, würde den Rahmen endgültig springen, daher hier einige weitere Features der JSR-303 stichpunktartig:</p>
<p><strong>Validierung von Objektgraphen</strong><br />
Durch die Annotation „@Valid“ können auch referenzierte Objekte in die Validierung ihres Parent-Objects einbezogen werden. Auf diese Weise ist es möglich,  mit einem Aufruf der Validierungs-API ganze Objektgraphen zu validieren.</p>
<p><strong>Mehrsprachige Meldungen</strong><br />
Ein Constraint kann eine eigene Fehlermeldung im Annotation-Element „message“ festlegen. Die Spezifikation beschreibt die Möglichkeit, die Meldungen mehrsprachig in ein  ResourceBundle auszulagern und in den Annotationen nur die sprachunabhängigen Schlüssel zu referenzieren.</p>
<p>Mit <strong>Class-Level Constraints</strong> können ganze Objekte anstatt einzelner Properties validiert werden. Als Anwendungsbeispiel kann man sich einen Validator vorstellen, der überprüft, ob die angegebene Stadt in einer Adresse zu Land und Postleitzahl passt.</p>
<p><strong>Validierungsgruppen</strong> ermöglichen eine teilweise Validierung und werden von der Community noch diskutiert, wobei die Expert Group nach Möglichkeiten sucht, dies verständlich und gleichzeitig flexibel zu gestalten.<br />
Eine Reihenfolge der Validierungen festzulegen ermöglicht die Annotation @GroupSequence.<br />
Mit Hilfe der Gruppen und Reihenfolge ist es möglich, dass in einer Anwendungsschicht nur bestimmte Validierungen durchgeführt werden („Wizzard-Style“) um auch bereits unvollständig initialisierte Objekte prüfen zu können oder die Validierung so gestaltet wird, dass zeitaufwändige Verarbeitungen nachgelagert werden („Short-Circuit“).</p>
<p>Mit der <strong>Constraint-Metadata API </strong>wird eine Schnittstelle definiert, die Auskunft über die Constraints einer Klasse oder einzelner Properties gibt. Auch diese API steht noch nicht abschließend fest, dürfte aber für Toolhersteller von besonderem Interesse sein.</p>
<p>Wer mehr über die Spezifikation erfahren möchte, sei auf den <a href="http://blog.emmanuelbernard.com/2008/05/jsr-303-interviews.html ">Blog des Lead-Autors</a> der JSR-303 verwiesen, der für alle Features auch Beispiele vorstellt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-13-standard/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lucene and T2000: don&#8217;t do it</title>
		<link>http://www.agimatec.de/blog/2008/11/lucene-and-t2000-dont-do-it/</link>
		<comments>http://www.agimatec.de/blog/2008/11/lucene-and-t2000-dont-do-it/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 09:32:15 +0000</pubDate>
		<dc:creator>Fabian Crabus</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[English]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=395</guid>
		<description><![CDATA[Maybe this is a good FAQ entry for Lucene: Is it possible to run Lucene on an older Sun Fire T2000? Yes, but don&#8217;t call it run. Some statistics (using Compass + Lucene) Index creation (5000 objects): 14502ms Initial search (&#8220;*&#8221;): 9544ms Compare this to a 2.2 Ghz MacBookPro: Index creation (5000 objects): 1071ms Initial [...]]]></description>
			<content:encoded><![CDATA[<p>Maybe this is a good FAQ entry for Lucene:</p>
<p><em>Is it possible to run Lucene on an older Sun Fire T2000?</em></p>
<p>Yes, but don&#8217;t call it run.</p>
<p><strong>Some statistics (using Compass + Lucene)<br />
</strong></p>
<p>Index creation (5000 objects): 14502ms</p>
<p>Initial search (&#8220;*&#8221;): 9544ms</p>
<p>Compare this to a 2.2 Ghz MacBookPro:</p>
<p>Index creation (5000 objects): 1071ms</p>
<p>Initial search (&#8220;*&#8221;): 614ms</p>
<p>Obviously (ok, it wasn&#8217;t for me) the single FPU is the bottle neck.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/11/lucene-and-t2000-dont-do-it/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTTP Header Sniffer</title>
		<link>http://www.agimatec.de/blog/2008/10/http-header-sniffer/</link>
		<comments>http://www.agimatec.de/blog/2008/10/http-header-sniffer/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 12:34:46 +0000</pubDate>
		<dc:creator>Simon Tiffert</dc:creator>
				<category><![CDATA[Deutsch]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=378</guid>
		<description><![CDATA[If you are interested in the headers of your HTTP Requests (and you should be interested), it is often hard to find the right tool for the job. On Windows I used Fiddler, which works well for IE and Chrome, but needs a proxy entry to work with Firefox. A commercial but also very nice [...]]]></description>
			<content:encoded><![CDATA[<p>If you are interested in the headers of your HTTP Requests (and you should be interested), it is often hard to find the right tool for the job. On Windows I used <a href="http://www.fiddlertool.com/">Fiddler</a>, which works well for IE and Chrome, but needs a proxy entry to work with Firefox. A commercial but also very nice tool is <a href="http://www.httpdebugger.com/">HttpDebuggerPro</a>, which has a good interface and filters.</p>
<p>I have switched to the Mac and was searching for a good tool. Live HTTP Headers is a Firefox Plugin but I don&#8217;t really liked it. Installed it today and the interface could be used for three requests, but has no overview for a lot of requests. With a search in the Firefox Add-Ons I found <a href="https://addons.mozilla.org/en-US/firefox/addon/6647">HttpFox</a>. It is exactly the tool I searched for. I nice table with all requests and a split panel of the bottom for request and response headers.</p>
<p>Have a look at the screenshot and install it &#8211; as soon as possible. Why?</p>
<ul>
<li><a href="http://www.agimatec.de/blog/2008/05/schritt-fur-schritt-zur-schnelleren-web-anwendung/">Step by step to a faster web app (german)</a></li>
<li><a href="http://www.agimatec.de/blog/2008/05/caching-mittels-http-header/">Caching with HTTP header (german</a></li>
<li><a href="http://www.agimatec.de/blog/2008/07/cache-refresh/">Cache refresh</a></li>
</ul>
<p><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/10/bild-7.png"><img class="alignnone size-medium wp-image-379" title="httpfox" src="http://www.agimatec.de/blog/wp-content/uploads/2008/10/bild-7.png" alt="" width="300" height="180" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/10/http-header-sniffer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Das Datenschutzdebakel</title>
		<link>http://www.agimatec.de/blog/2008/08/das-datenschutzdebakel/</link>
		<comments>http://www.agimatec.de/blog/2008/08/das-datenschutzdebakel/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 15:09:26 +0000</pubDate>
		<dc:creator>Roland Müller</dc:creator>
				<category><![CDATA[Deutsch]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=303</guid>
		<description><![CDATA[Im Zuge der Datenschutzaffäre um gehandelte Kunden- und Kontodaten meldet Golem.de heute: Datenschützer: Adressen aller Bundesbürger im Umlauf Ein Skandal! Wie konnte das nur passieren&#8230;? Ich konnte es mir nicht verkneifen.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Im Zuge der Datenschutzaffäre um gehandelte Kunden- und Kontodaten meldet Golem.de heute:</p>
<p style="text-align: left;"><strong><a href="http://www.golem.de/0808/61858.html">Datenschützer: Adressen aller Bundesbürger im Umlauf</a> </strong></p>
<p style="text-align: left;">Ein Skandal! Wie konnte das nur passieren&#8230;?</p>
<p style="text-align: center;"><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/08/telefonbuch.png"><img class="size-full wp-image-305 aligncenter" title="telefonbuch" src="http://www.agimatec.de/blog/wp-content/uploads/2008/08/telefonbuch.png" alt="" width="266" height="300" /></a></p>
<p style="text-align: center;"><span style="color: #999999;">Ich konnte es mir nicht verkneifen.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/08/das-datenschutzdebakel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wrapper Quiz</title>
		<link>http://www.agimatec.de/blog/2008/08/wrapper-quiz/</link>
		<comments>http://www.agimatec.de/blog/2008/08/wrapper-quiz/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 10:44:26 +0000</pubDate>
		<dc:creator>Simon Tiffert</dc:creator>
				<category><![CDATA[Deutsch]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=240</guid>
		<description><![CDATA[Is following code compiling? If yes, what is the result? public class Calculation { public static void main(String[] args) { Long result = 3l; result += new Long(3); if(Boolean.parseBoolean("Wrong") &#124;&#124; Boolean.parseBoolean("True")) { result++; } System.out.println("Result: " + result ); } }]]></description>
			<content:encoded><![CDATA[<p>Is following code compiling? If yes, what is the result?</p>
<pre class="java" name="code">
public class Calculation {
    public static void main(String[] args) {
        Long result = 3l;
        result += new Long(3);

        if(Boolean.parseBoolean("Wrong") || Boolean.parseBoolean("True")) {
            result++;
        }

        System.out.println("Result: " + result );
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/08/wrapper-quiz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der König ist tot. Lang lebe der König&#8230;</title>
		<link>http://www.agimatec.de/blog/2008/07/der-konig-ist-tot-lang-lebe-der-konig/</link>
		<comments>http://www.agimatec.de/blog/2008/07/der-konig-ist-tot-lang-lebe-der-konig/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 15:14:35 +0000</pubDate>
		<dc:creator>Roland Müller</dc:creator>
				<category><![CDATA[Deutsch]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=186</guid>
		<description><![CDATA[Wer bisher Googles Dienst &#8220;Google Browser Sync&#8221; nutzte, um seine Browser-Daten wie z.B. die Bookmarks zwischen mehreren Rechnern konsistent zu halten, wurde möglicherweise von der Einstellung des Projekts seitens Google überrascht. Nun, seit gestern ist die zweite Version (0.2) von Weave, einem Projekt der Mozilla Labs verfügbar: &#8220;Weave is an experimental prototype from Mozilla Labs [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/07/weave.png"><img class="aligncenter size-full wp-image-187" title="weave" src="http://www.agimatec.de/blog/wp-content/uploads/2008/07/weave.png" alt="" width="500" height="221" /></a></p>
<p>Wer bisher Googles Dienst &#8220;Google Browser Sync&#8221; nutzte, um seine Browser-Daten wie z.B. die Bookmarks zwischen mehreren Rechnern konsistent zu halten, wurde möglicherweise von der <a title="No more Google Sync..." href="http://googlesystem.blogspot.com/2008/06/google-browser-sync-to-be-discontinued.html">Einstellung des Projekts seitens Google</a> überrascht.</p>
<p>Nun, seit gestern ist die zweite Version (0.2) von Weave, einem Projekt der Mozilla Labs verfügbar:</p>
<p><em>&#8220;Weave is an experimental prototype from Mozilla Labs that integrates             online services with Firefox.&#8221;</em></p>
<p>Was auch immer da noch kommen mag, die meisten Funktionen von Googles Tool ersetzt Mozillas Service schon heute. Wer es ausprobieren möchte, kann das AddOn hier herunterladen: <a title="Mozilla Services" href="https://services.mozilla.com/">services.mozilla.com</a></p>
<p>Risikobereitschaft ist übrigens in dreifachem Sinne nötig. Erstens befindet das Tool noch im Prototypenstadium, zweitens ist es nicht jedermanns Sache, persönliche Daten über das Internet zu synchronisieren (auch wenn die Daten verschlüsselt auf Mozillas Servern hinterlegt werden) und drittens bemängelt Firefox 3 das Sicherheitszertifikat der Download-Seite&#8230; Ich gebe zu, vertrauenserweckend ist das nicht. ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/07/der-konig-ist-tot-lang-lebe-der-konig/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gutes Betriebsklima&#8230;</title>
		<link>http://www.agimatec.de/blog/2008/06/gutes-betriebsklima/</link>
		<comments>http://www.agimatec.de/blog/2008/06/gutes-betriebsklima/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 05:42:27 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Absonderlichkeiten]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=185</guid>
		<description><![CDATA[&#8230; ist uns wichtig! Unser Tipp gegen &#8220;Montagsmüdigkeit&#8221;:]]></description>
			<content:encoded><![CDATA[<p>&#8230; ist uns wichtig! Unser Tipp gegen &#8220;Montagsmüdigkeit&#8221;:<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/pVKnF26qFFM&#038;hl=de"></param><embed src="http://www.youtube.com/v/pVKnF26qFFM&#038;hl=de" type="application/x-shockwave-flash" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/06/gutes-betriebsklima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
