<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br><br>On 11 déc. 2012, at 14:43, Gunnar Morling &lt;<a href="mailto:gunnar@hibernate.org">gunnar@hibernate.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div>&gt;&nbsp;<span style="font-family:arial,sans-serif;font-size:13px">@DecimalMax(value = "0.0", exclusive = true)</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br>
</span></div><div>Can we name it "inclusive" rather than "exclusive"? Personally I prefer positive variable/method names as I think they read better, in particular when it comes to negation.</div></blockquote><div><br></div><div>I like inclusive as well</div><br><blockquote type="cite"><div>
<br></div><div><span style="font-family:arial,sans-serif;font-size:13px">&gt; When dealing with decimal number such a flag can indeed simplify things,&nbsp;</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">&gt; however it creates&nbsp;</span><span style="font-family:arial,sans-serif;font-size:13px">a problem when dealing with error messages.</span><br>
</div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div>I think selecting the right message within the validator impl is sufficient. The spec could just describe which text is to be chosen in which case. Being able to make use of more advanced formatting logic (conditionals etc.) in messages is something which we should discuss separately IMO.</div></blockquote><div><br></div><div>Yes and no. Should we postpone this issue until the formatting logic is powerful enough? Or should we go for a solution we will want to deprecate down the road?</div><br><blockquote type="cite">
<div><br></div><div>A possible alternative would be to make use of&nbsp;constraint composition. E.g. @DecimalMin could be a composed constraint like this:</div><div><br></div>@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })<br>
@Retention(RUNTIME)<br>@Documented<br>@DecimalMinExclusive("")<br>@DecimalMinInclusive("")<br>@Constraint(validatedBy = { })<br>public @interface DecimalMin {<br><br>&nbsp; &nbsp; String message() default "";<br>
&nbsp; &nbsp; Class&lt;?&gt;[] groups() default { };<br>&nbsp; &nbsp; Class&lt;? extends Payload&gt;[] payload() default { };<br><br>&nbsp; &nbsp; @OverridesAttribute.List( {<br>&nbsp; &nbsp; &nbsp; &nbsp; @OverridesAttribute(constraint=DecimalMinInclusive.class, name="value"),<br>
&nbsp; &nbsp; &nbsp; &nbsp; @OverridesAttribute(constraint=DecimalMinExclusive.class, name="value")&nbsp;<br>&nbsp; &nbsp; } )<br>&nbsp; &nbsp; String value();<br><br>&nbsp; &nbsp;&nbsp;@OverridesAttribute.List( {<br>&nbsp; &nbsp; &nbsp; &nbsp; @OverridesAttribute(constraint=DecimalMinInclusive.class, name="inclusive"),<br>
&nbsp; &nbsp; &nbsp; &nbsp; @OverridesAttribute(constraint=DecimalMinExclusive.class, name="inclusive")&nbsp;<br>&nbsp; &nbsp; } )<br>&nbsp; &nbsp; boolean inclusive() default true;<br>}<br><div><br></div><div>Depending on the value of the "inclusive" attribute, only one of the validators for @DecimalMinExclusive and @DecimalMinInclusive would validate the given value and potentially raise an error.&nbsp;By decomposing the validation into two distinct constraints we could make use of plain error messages:</div>
<br>javax.validation.constraints.DecimalMinInclusive.message &nbsp;= must be greater than or equal to {value}<br>javax.validation.constraints.DecimalMinExclusive.message &nbsp;= must be greater than {value}<br><div><br></div><div>The main issue with that approach is that DecimalMinInclusive etc. would be part of the API, although they ideally shouldn't be directly used by BV end users.</div></blockquote><div><br></div><div>I don't like this approach very much. From a user pov, it's as annoying as the double message and pollute the API with annotations they should never use.&nbsp;</div><br><blockquote type="cite">
<div><br></div><div>&gt;&nbsp;<span style="font-family:arial,sans-serif;font-size:13px">I also like the approach taken in OVal. There you can create/change message&nbsp;</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">&gt; variables by overriding 'Map&lt;String, String&gt; createMessageVariables()'.&nbsp;</span><span style="font-family:arial,sans-serif;font-size:13px">Something&nbsp;</span></div>




<div><span style="font-family:arial,sans-serif;font-size:13px">&gt; like this could for example be added to ConstraintValidatorContext.</span><br><div><br></div><div>A while ago I created BVAL-339 [2] which I think goes into this direction. It suggests to add a method setValue() to ConstraintValidatorContext, allowing to set arbitrary message attributes:</div>




<div><br></div>context<br>&nbsp; &nbsp; .buildConstraintViolationWithTemplate( "Must be after {now}" )<br>&nbsp; &nbsp; .setValue( "now", now )<br>&nbsp; &nbsp; .addConstraintViolation();<div><br></div><div>Independent from the originally discussed issue, I think adding this would makes sense in any case. If no one objects, I can create pull requests for this.</div>
<div><br></div></div></blockquote><div><br></div><div>I see this as less useful than the formatting improvements reusing the EL engine. So if I had to prioritize I'd put this one after.&nbsp;</div><div>Do you have use cases by the way? The example with now is not really convincing :)</div></body></html>