<style>
/* Changing the layout to use less space for mobiles */
@media screen and (max-device-width: 480px), screen and (-webkit-min-device-pixel-ratio: 2) {
#email-body { min-width: 30em !important; }
#email-page { padding: 8px !important; }
#email-banner { padding: 8px 8px 0 8px !important; }
#email-avatar { margin: 1px 8px 8px 0 !important; padding: 0 !important; }
#email-fields { padding: 0 8px 8px 8px !important; }
#email-gutter { width: 0 !important; }
}
</style>
<div id="email-body">
<table id="email-wrap" align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#f0f0f0;color:#000000;width:100%;">
<tr valign="top">
<td id="email-page" style="padding:16px !important;">
<table align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#ffffff;border:1px solid #bbbbbb;color:#000000;width:100%;">
<tr valign="top">
<td bgcolor="#3e4c4e" style="background-color:#3e4c4e;color:#ffffff;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;line-height:1;"><img src="https://www.jboss.org/dms/hibernate/images/jira/jiraheader_hibernate.png" alt="" style="vertical-align:top;" /></td>
</tr><tr valign="top">
<td id="email-banner" style="padding:32px 32px 0 32px;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;">
<tr valign="top">
<td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;padding:0;">
<img id="email-avatar" src="https://secure.gravatar.com/avatar/12df4da7e3351be801bc16b66caf8038?d=mm&s=48" alt="" height="48" width="48" border="0" align="left" style="padding:0;margin: 0 16px 16px 0;" />
<div id="email-action" style="padding: 0 0 8px 0;font-size:12px;line-height:18px;">
<a class="user-hover" rel="hardy.ferentschik" id="email_hardy.ferentschik" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=hardy.ferentschik" style="color:#6c797f;">Hardy Ferentschik</a>
updated <img src="https://hibernate.atlassian.net/images/icons/issuetypes/newfeature.png" height="16" width="16" border="0" align="absmiddle" alt="New Feature"> <a style='color:#6c797f;text-decoration:none;' href='https://hibernate.atlassian.net/browse/BVAL-233'>BVAL-233</a>
</div>
<div id="email-summary" style="font-size:16px;line-height:20px;padding:2px 0 16px 0;">
<a style='color:#6c797f;text-decoration:none;' href='https://hibernate.atlassian.net/browse/BVAL-233'><strong>Provide additional, including custom variables, for message interpolation</strong></a>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr valign="top">
<td id="email-fields" style="padding:0 32px 32px 32px;">
<table border="0" cellpadding="0" cellspacing="0" style="padding:0;text-align:left;width:100%;" width="100%">
<tr valign="top">
<td id="email-gutter" style="width:64px;white-space:nowrap;"></td>
<td>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Change By:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<a class="user-hover" rel="hardy.ferentschik" id="email_hardy.ferentschik" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=hardy.ferentschik" style="color:#6c797f;">Hardy Ferentschik</a>
(01/Jul/13 3:33 AM)
</td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Description:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffcontext">I'm using the Hibernate Validators since the day it got released. I wrote some extensions which also might be useful to other users:</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">I extended the MessageInterpolator so that I can use the rootBean, leafBean and the invalidValue in the message templates. Further I added support for nested properties. Here are some samples for (extended) message templates:</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> - "</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> <br>{noformat}<br></span>
<span class="diffcontext">The age of {leafBean.firstname} {leafBean.lastname} must be between {min} and {max} but is {invalidValue}.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">"</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br>{noformat}<br></span>
<span class="diffcontext"> => "The age of John Doe must be between 18 and 65 but is 17."</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> - "</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> <br><br>{noformat}<br></span>
<span class="diffcontext">Error on {rootBean}: The the transaction's ({leafBean.transactionId}) amount ({invalidValue}) is too low.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">" - "</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext">{</span>
<span class="diffaddedchars" style="background-color:#ddfade;">noformat}<br><br>{noformat}<br>{</span>
<span class="diffcontext">invalidValue} is not a valid account number."</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br>{noformat}<br><br></span>
<span class="diffcontext"> While this information is unnecessary while you are typing the data and see the whole record, it might be essential if the input is a file and the message is written to a log.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">It would also useful to provide some custom properties in the</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> MessageInterpolator</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> _MessageInterpolator_</span>
<span class="diffcontext"> context:</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br>{code}<br></span>
<span class="diffcontext">beanValidator.validateValue(Person.class, "firstName", person.getFirstName);</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> <br>//</span>
<span class="diffcontext"> ...</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> <br></span>
<span class="diffcontext"> ctx.put("fieldName", "first name");</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> <br></span>
<span class="diffcontext"> msgInterpolator.interpolate(constraintViolation.getMessageTemplate(), ctx);</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> -</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br>{code}<br>=></span>
<span class="diffcontext"> "The field '{context.fieldName}' must not be empty."</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">While the</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> leafBean</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> _leafBean_</span>
<span class="diffcontext"> is available as</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> "validatedValue"</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> _validatedValue_</span>
<span class="diffcontext"> in the</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> MessageInterpolator</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> _MessageInterpolator</span>
<span class="diffcontext">.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">Context</span>
<span class="diffaddedchars" style="background-color:#ddfade;">Context_</span>
<span class="diffcontext">, I had to extend the context to provide the other values.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">The validator has only access to the validated object and the annotation. It is not always possible and reasonable to set the context information on the validated object. It would be good to have some context available in the validator. Now I pass the context information through a</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> threadlocal</span>
<span class="diffaddedchars" style="background-color:#ddfade;"> _ThreadLocal_</span>
<span class="diffcontext"> variable which is very ugly and error prone. E.g. a validator could check if a value is equal to an entry of a dynamic list which depends on the context.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">Sometimes it would be useful to pass some context to the validator:</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">{code}</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext">validateBean(Object validationContext, T object, Class<?>... groups)</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext">validateProperty(Object validationContext, T object, String propertyName, Class<?>... groups);</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext">...</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">public class MyValidator implements javax.validation.ConstraintValidator<MyConstraint, MyObject> {</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext"> public boolean isValid(MyObject myObject, ConstraintValidatorContext context) {</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext"> ((MyService) context.getValidatorContext()).doSomeComplexValidation(myObject);</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext"> }</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext">{code}</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">Of course time consuming validation should not be triggered too often. A constaint causing such a validation would typically not define the Default.class group.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">See also:</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br></span>
<span class="diffcontext">http://relation.to/Bloggers/JSRBeanVali ... mment19490</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"><br><br></span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br><br></span>
<span class="diffcontext">Regards René</span>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td><!-- End #email-page -->
</tr>
<tr valign="top">
<td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:10px;line-height:14px;padding: 0 16px 16px 16px;text-align:center;">
This message is automatically generated by JIRA.<br />
If you think it was sent incorrectly, please contact your JIRA administrators<br />
For more information on JIRA, see: <a style='color:#6c797f;' href='http://www.atlassian.com/software/jira'>http://www.atlassian.com/software/jira</a>
</td>
</tr>
</table><!-- End #email-wrap -->
</div><!-- End #email-body -->