[hibernate-issues] [Hibernate-JIRA] Resolved: (HV-508) DecimalMaxValidatorForNumber for a double values is not correct

Hardy Ferentschik (JIRA) noreply at atlassian.com
Wed Jul 20 10:35:14 EDT 2011


     [ http://opensource.atlassian.com/projects/hibernate/browse/HV-508?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Hardy Ferentschik resolved HV-508.
----------------------------------

       Resolution: Fixed
    Fix Version/s: 4.3.0.next

thanks for the tip and test case

> DecimalMaxValidatorForNumber for a double values is not correct
> ---------------------------------------------------------------
>
>                 Key: HV-508
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HV-508
>             Project: Hibernate Validator
>          Issue Type: Bug
>          Components: validators
>    Affects Versions: 4.2.0.Final
>         Environment: hibernate-validator-4.2.0.Final.jar
> validation-api-1.0.0.GA.jar
> database independent
>            Reporter: Donigiewicz
>              Labels: DecimalMax
>             Fix For: 4.3.0.next
>
>
> Hi ,
> In our project we are about to update a validation library from 4.1.CR1 version to 4.2.Final.
> Update to 4.1 is not an option for us due to some other problems.
> Unfortunately we have encountered that atleast DecimalMax constraint is not working as it was in former version
> See the example below
> A bean 
> {code}
> public class SpecificBean extends Bean {
>    private Double doubleTrouble;
>    @DecimalMax("1.2")
>    public Double getDoubleTrouble() {
>       return doubleTrouble;
>    }
>    public void setDoubleTrouble(Double doubleTrouble) {
>       this.doubleTrouble = doubleTrouble;
>    }
>    public String getQualifier() {
>       return "qualifier";
>    }
> }
> {code}
> And a simple testing class 
> {code}
> public class ValidatorCheck {
>    /**
>     * @param args
>     */
>    public static void main(String[] args) {
>             
>       ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
>       Validator validator =  factory.getValidator();
>       
>       SpecificBean bean2 = new SpecificBean();
>       bean2.setDoubleTrouble(Double.valueOf(1.0));
>       Set<ConstraintViolation<SpecificBean>> viols2 =  validator.validate(bean2);
>       checkIfNoViolation(viols2);
>       bean2.setDoubleTrouble(Double.valueOf(1.1));
>       viols2 =  validator.validate(bean2);
>       checkIfNoViolation(viols2);
>       bean2.setDoubleTrouble(Double.valueOf(1.19));
>       viols2 =  validator.validate(bean2);
>       checkIfNoViolation(viols2);
>       bean2.setDoubleTrouble(Double.valueOf(1.20));
>       viols2 =  validator.validate(bean2);
>       checkIfNoViolation(viols2);
>       bean2.setDoubleTrouble(Double.valueOf(1.21));
>       viols2 =  validator.validate(bean2);
>       checkIfViolation(viols2);
>       bean2.setDoubleTrouble(Double.valueOf(1.3));
>       viols2 =  validator.validate(bean2);
>       checkIfViolation(viols2);
>       
>       bean2.setDoubleTrouble(Double.valueOf(1.51));
>       viols2 =  validator.validate(bean2);
>       checkIfViolation(viols2);
>       bean2.setDoubleTrouble(Double.valueOf(1.9));
>       viols2 =  validator.validate(bean2);
>       checkIfViolation(viols2); 
>       
>       bean2.setDoubleTrouble(Double.valueOf(2.000000001));
>       viols2 =  validator.validate(bean2);
>       checkIfViolation(viols2);
>       
>    }
>    private static void checkIfNoViolation(
>          Set<ConstraintViolation<SpecificBean>> viols2) {
>       Assert.assertTrue(viols2.isEmpty());
>    }
>    
>    private static void checkIfViolation(
>          Set<ConstraintViolation<SpecificBean>> viols2) {
>       Assert.assertFalse("Expected violations ",viols2.isEmpty());
>    }
> }
> {code}
> It is obvious if you see in the DecimalMaxValidatorForNumber
> {code}
> public boolean isValid(Number value, ConstraintValidatorContext constraintValidatorContext) {
>       //null values are valid
>       if ( value == null ) {
>          return true;
>       }
>       if ( value instanceof BigDecimal ) {
>          return ( ( BigDecimal ) value ).compareTo( maxValue ) != 1;
>       }
>       else if ( value instanceof BigInteger ) {
>          return ( new BigDecimal( ( BigInteger ) value ) ).compareTo( maxValue ) != 1;
>       }
>       else {
>          return ( BigDecimal.valueOf( value.longValue() ).compareTo( maxValue ) ) != 1;
>       }
>    }
> {code}
> I'm suspecting the cause of this is a https://issues.apache.org/jira/browse/BVAL-15

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list