<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&#39;m&nbsp;using&nbsp;the&nbsp;Hibernate&nbsp;Validators&nbsp;since&nbsp;the&nbsp;day&nbsp;it&nbsp;got&nbsp;released.&nbsp;I&nbsp;wrote&nbsp;some&nbsp;extensions&nbsp;which&nbsp;also&nbsp;might&nbsp;be&nbsp;useful&nbsp;to&nbsp;other&nbsp;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&nbsp;extended&nbsp;the&nbsp;MessageInterpolator&nbsp;so&nbsp;that&nbsp;I&nbsp;can&nbsp;use&nbsp;the&nbsp;rootBean,&nbsp;leafBean&nbsp;and&nbsp;the&nbsp;invalidValue&nbsp;in&nbsp;the&nbsp;message&nbsp;templates.&nbsp;Further&nbsp;I&nbsp;added&nbsp;support&nbsp;for&nbsp;nested&nbsp;properties.&nbsp;Here&nbsp;are&nbsp;some&nbsp;samples&nbsp;for&nbsp;(extended)&nbsp;message&nbsp;templates:</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;-&nbsp;&quot;</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;<br>{noformat}<br></span>
<span class="diffcontext">The&nbsp;age&nbsp;of&nbsp;{leafBean.firstname}&nbsp;{leafBean.lastname}&nbsp;must&nbsp;be&nbsp;between&nbsp;{min}&nbsp;and&nbsp;{max}&nbsp;but&nbsp;is&nbsp;{invalidValue}.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&quot;</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br>{noformat}<br></span>
<span class="diffcontext">&nbsp;=&gt;&nbsp;&quot;The&nbsp;age&nbsp;of&nbsp;John&nbsp;Doe&nbsp;must&nbsp;be&nbsp;between&nbsp;18&nbsp;and&nbsp;65&nbsp;but&nbsp;is&nbsp;17.&quot;</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;-&nbsp;&quot;</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;<br><br>{noformat}<br></span>
<span class="diffcontext">Error&nbsp;on&nbsp;{rootBean}:&nbsp;The&nbsp;the&nbsp;transaction&#39;s&nbsp;({leafBean.transactionId})&nbsp;amount&nbsp;({invalidValue})&nbsp;is&nbsp;too&nbsp;low.</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&quot;&nbsp;-&nbsp;&quot;</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}&nbsp;is&nbsp;not&nbsp;a&nbsp;valid&nbsp;account&nbsp;number.&quot;</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br>{noformat}<br><br></span>
<span class="diffcontext">&nbsp;While&nbsp;this&nbsp;information&nbsp;is&nbsp;unnecessary&nbsp;while&nbsp;you&nbsp;are&nbsp;typing&nbsp;the&nbsp;data&nbsp;and&nbsp;see&nbsp;the&nbsp;whole&nbsp;record,&nbsp;it&nbsp;might&nbsp;be&nbsp;essential&nbsp;if&nbsp;the&nbsp;input&nbsp;is&nbsp;a&nbsp;file&nbsp;and&nbsp;the&nbsp;message&nbsp;is&nbsp;written&nbsp;to&nbsp;a&nbsp;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&nbsp;would&nbsp;also&nbsp;useful&nbsp;to&nbsp;provide&nbsp;some&nbsp;custom&nbsp;properties&nbsp;in&nbsp;the</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;MessageInterpolator</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;_MessageInterpolator_</span>
<span class="diffcontext">&nbsp;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,&nbsp;&quot;firstName&quot;,&nbsp;person.getFirstName);</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;<br>//</span>
<span class="diffcontext">&nbsp;...</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;<br></span>
<span class="diffcontext">&nbsp;ctx.put(&quot;fieldName&quot;,&nbsp;&quot;first&nbsp;name&quot;);</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;<br></span>
<span class="diffcontext">&nbsp;msgInterpolator.interpolate(constraintViolation.getMessageTemplate(),&nbsp;ctx);</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;-</span>
<span class="diffaddedchars" style="background-color:#ddfade;"><br>{code}<br>=&gt;</span>
<span class="diffcontext">&nbsp;&quot;The&nbsp;field&nbsp;&#39;{context.fieldName}&#39;&nbsp;must&nbsp;not&nbsp;be&nbsp;empty.&quot;</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&nbsp;the</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;leafBean</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;_leafBean_</span>
<span class="diffcontext">&nbsp;is&nbsp;available&nbsp;as</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;&quot;validatedValue&quot;</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;_validatedValue_</span>
<span class="diffcontext">&nbsp;in&nbsp;the</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;MessageInterpolator</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;_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">,&nbsp;I&nbsp;had&nbsp;to&nbsp;extend&nbsp;the&nbsp;context&nbsp;to&nbsp;provide&nbsp;the&nbsp;other&nbsp;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&nbsp;validator&nbsp;has&nbsp;only&nbsp;access&nbsp;to&nbsp;the&nbsp;validated&nbsp;object&nbsp;and&nbsp;the&nbsp;annotation.&nbsp;It&nbsp;is&nbsp;not&nbsp;always&nbsp;possible&nbsp;and&nbsp;reasonable&nbsp;to&nbsp;set&nbsp;the&nbsp;context&nbsp;information&nbsp;on&nbsp;the&nbsp;validated&nbsp;object.&nbsp;It&nbsp;would&nbsp;be&nbsp;good&nbsp;to&nbsp;have&nbsp;some&nbsp;context&nbsp;available&nbsp;in&nbsp;the&nbsp;validator.&nbsp;Now&nbsp;I&nbsp;pass&nbsp;the&nbsp;context&nbsp;information&nbsp;through&nbsp;a</span>
<span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">&nbsp;threadlocal</span>
<span class="diffaddedchars" style="background-color:#ddfade;">&nbsp;_ThreadLocal_</span>
<span class="diffcontext">&nbsp;variable&nbsp;which&nbsp;is&nbsp;very&nbsp;ugly&nbsp;and&nbsp;error&nbsp;prone.&nbsp;E.g.&nbsp;a&nbsp;validator&nbsp;could&nbsp;check&nbsp;if&nbsp;a&nbsp;value&nbsp;is&nbsp;equal&nbsp;to&nbsp;an&nbsp;entry&nbsp;of&nbsp;a&nbsp;dynamic&nbsp;list&nbsp;which&nbsp;depends&nbsp;on&nbsp;the&nbsp;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&nbsp;it&nbsp;would&nbsp;be&nbsp;useful&nbsp;to&nbsp;pass&nbsp;some&nbsp;context&nbsp;to&nbsp;the&nbsp;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&nbsp;validationContext,&nbsp;T&nbsp;object,&nbsp;Class&lt;?&gt;...&nbsp;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&nbsp;validationContext,&nbsp;T&nbsp;object,&nbsp;String&nbsp;propertyName,&nbsp;Class&lt;?&gt;...&nbsp;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&nbsp;class&nbsp;MyValidator&nbsp;implements&nbsp;javax.validation.ConstraintValidator&lt;MyConstraint,&nbsp;MyObject&gt;&nbsp;{</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">&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;isValid(MyObject&nbsp;myObject,&nbsp;ConstraintValidatorContext&nbsp;context)&nbsp;{</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((MyService)&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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&nbsp;course&nbsp;time&nbsp;consuming&nbsp;validation&nbsp;should&nbsp;not&nbsp;be&nbsp;triggered&nbsp;too&nbsp;often.&nbsp;A&nbsp;constaint&nbsp;causing&nbsp;such&nbsp;a&nbsp;validation&nbsp;would&nbsp;typically&nbsp;not&nbsp;define&nbsp;the&nbsp;Default.class&nbsp;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&nbsp;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&nbsp;...&nbsp;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&nbsp;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 -->