You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Francois Meillet <fr...@gmail.com> on 2015/09/15 11:00:16 UTC

BeanValidation --> wrong maxlength value in TextField

Hi,

I have a very strange problem !!!


A form is created using a model object containing validation annotation constraints.

The model object contains 3 properties (aaaaa, firstName, lastName) with annotations like this

@Size.List({
	@Size(min=2, message = "{xxx.sizeToSmall}"),
	@Size(max=50, message = "{xxx.sizeToBig}")
})

xxx.sizeToSmall and xxx.sizeToBig key/value are present in the WicketApplication.utf8.properties file

When the form is rendered, the maxlength value may be wrong.


Actually the maxlength value is only wrong with the property 'firstName'

with the following html
<input wicket:id="firstName" id="firstName" type="text"  />
<input wicket:id="firstName" id="firstName" type="text" maxlength="50" />

but with
<input wicket:id="firstName" id="firstName" type="text" MAXLENGTH="50" />
the value will be ok

This only happens with this 'firstName' property !!!


Environment:
-----------
Wicket 7.0.0
validation implementation : hibernate-validator
OSX & jdk 1.8


here is the quickstart

Thanks for yours suggestions

Fran�ois  








Re: BeanValidation --> wrong maxlength value in TextField

Posted by Francois Meillet <fr...@gmail.com>.
Hi Martin,

Sorry for the <head> <body>.
I miss it.

Thanks for your insights.

In the ConstraintIterator's constructor, the set returned by the Hibernate validation implementation (Set<ConstraintDescriptor<?>> constraints)
is unordered.

Either by calling
Set<ConstraintDescriptor<?>> constraints = propDesc.findConstraints()
					.unorderedAndMatchingGroups(groups)
					.getConstraintDescriptors();
					
or 				
BeanDescriptor beanDescriptor = validator.getConstraintsForClass(IdentityRegistrationModel.class);
PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty(property);
Set<ConstraintDescriptor<?>> constraintDescriptors = propertyDescriptor.getConstraintDescriptors();

As there are 2 annotations with the same type (Size) per property, 
@Size.List({
	@Size(min=4, message = "{firstName.sizeToSmall}"),
	@Size(max=50, message = "{firstName.sizeToBig}")
})
the last call to SizeTagModifier # tag.put() wins and maxlength may be wrong (Integer.MAX_VALUE).

The validation itself, when form is submitted, is OK.
Only the maxlenght may be wrong.   
           

One way to fix this problem :

In the ConstraintIterator's constructor, before populating the stack,
an iteration could be made over the 'Set<ConstraintDescriptor<?>> constraints' to find ConstraintDescriptor with Annotation's type = Size,
and if there is more than one, the biggest (=Integer.MAX_VALUE) max value should be removed.

The other way is to add an AttributeModifier to the textfield, new AttributeModifier("maxlength", new Model<>(50))). 
Which I do.

François








Le 15 sept. 2015 à 21:47, Martin Grigorov <mg...@apache.org> a écrit :

> Hi Francois,
> 
> A miracle happened after adding <head> & <body> HTML elements to
> PageWithForm.html ;-)
> Without <head> Wicket logs an ERROR.
> 
> About Integer.MAX_VALUE - a breakpoint
> at org.apache.wicket.bean.validation.SizeTagModifier#modify shows that this
> method is called twice per property. Once with annotation.max() returning
> MAX_VALUE and second time with the set value(50). Maybe there is a bug at
> Hibernate-Validator
> or org.apache.wicket.bean.validation.ConstraintIterator#ConstraintIterator.
> 
> Enjoy!
> 
> Martin Grigorov
> Wicket Training and Consulting
> https://twitter.com/mtgrigorov
> 
> On Tue, Sep 15, 2015 at 11:00 AM, Francois Meillet <
> francois.meillet@gmail.com> wrote:
> 
>> Hi,
>> 
>> I have a very strange problem !!!
>> 
>> 
>> A form is created using a model object containing validation annotation
>> constraints.
>> 
>> The model object contains 3 properties (aaaaa, firstName, lastName) with
>> annotations like this
>> 
>> @Size.List({
>> @Size(min=2, message = "{xxx.sizeToSmall}"),
>> @Size(max=50, message = "{xxx.sizeToBig}")
>> })
>> 
>> xxx.sizeToSmall and xxx.sizeToBig key/value are present in the
>> WicketApplication.utf8.properties file
>> 
>> When the form is rendered, the maxlength value may be wrong.
>> 
>> 
>> Actually the maxlength value is only wrong with the property 'firstName'
>> 
>> with the following html
>> <input wicket:id="firstName" id="firstName" type="text"  />
>> <input wicket:id="firstName" id="firstName" type="text" maxlength="50" />
>> 
>> but with
>> <input wicket:id="firstName" id="firstName" type="text" MAXLENGTH="50" />
>> the value will be ok
>> 
>> This only happens with this 'firstName' property !!!
>> 
>> 
>> Environment:
>> -----------
>> Wicket 7.0.0
>> validation implementation : hibernate-validator
>> OSX & jdk 1.8
>> 
>> 
>> here is the quickstart
>> 
>> Thanks for yours suggestions
>> 
>> François
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 


Re: BeanValidation --> wrong maxlength value in TextField

Posted by Martin Grigorov <mg...@apache.org>.
Hi Francois,

A miracle happened after adding <head> & <body> HTML elements to
PageWithForm.html ;-)
Without <head> Wicket logs an ERROR.

About Integer.MAX_VALUE - a breakpoint
at org.apache.wicket.bean.validation.SizeTagModifier#modify shows that this
method is called twice per property. Once with annotation.max() returning
MAX_VALUE and second time with the set value(50). Maybe there is a bug at
Hibernate-Validator
or org.apache.wicket.bean.validation.ConstraintIterator#ConstraintIterator.

Enjoy!

Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Tue, Sep 15, 2015 at 11:00 AM, Francois Meillet <
francois.meillet@gmail.com> wrote:

> Hi,
>
> I have a very strange problem !!!
>
>
> A form is created using a model object containing validation annotation
> constraints.
>
> The model object contains 3 properties (aaaaa, firstName, lastName) with
> annotations like this
>
> @Size.List({
> @Size(min=2, message = "{xxx.sizeToSmall}"),
> @Size(max=50, message = "{xxx.sizeToBig}")
> })
>
> xxx.sizeToSmall and xxx.sizeToBig key/value are present in the
> WicketApplication.utf8.properties file
>
> When the form is rendered, the maxlength value may be wrong.
>
>
> Actually the maxlength value is only wrong with the property 'firstName'
>
> with the following html
> <input wicket:id="firstName" id="firstName" type="text"  />
> <input wicket:id="firstName" id="firstName" type="text" maxlength="50" />
>
> but with
> <input wicket:id="firstName" id="firstName" type="text" MAXLENGTH="50" />
> the value will be ok
>
> This only happens with this 'firstName' property !!!
>
>
> Environment:
> -----------
> Wicket 7.0.0
> validation implementation : hibernate-validator
> OSX & jdk 1.8
>
>
> here is the quickstart
>
> Thanks for yours suggestions
>
> François
>
>
>
>
>
>
>
>
>
>