We already try to guess the type if the user doesn't set it (but not in
constructor but much later when the component/model hierarchy is completed)
But if the type is a String.class we will not set it and ignore it.

So you shouldn't set the type to String.class by default, only set it when
you really want a String to String conversion.

johan


On Mon, Mar 31, 2008 at 3:46 PM, Eric Rotick <[EMAIL PROTECTED]> wrote:

> I guess, if this was a real issue then more users would have reported it.
> However, as a TextField is such an innocent component then any confusing
> behaviour should be addressed. Maintaining a common behaviour of
> setConvertEmptyInputStringToNull would do that and your proposed solution
> looks good.
>
> One thing which was confusing from the javadocs level is the implication
> that the setting of a type is defaulted; i.e.
>
> public TextField( String id, Class type ) {
> super( id );
> setType( type );
> ...
> }
>
> public TextField( String id ) {
> super( id );
> Class type = workOutTypeFromModelIfPossible( );
> if( type == null ) {
> type = String.class;
> }
> setType( type );
> ...
> }
>
> In other words, there is always a type set unless the model is one which
> does not allow for it to be derived in which case String is assumed as in
> the FormComponent javadocs for setType.
>
> Eric.
>
> On Mon, Mar 31, 2008 at 1:37 PM, Johan Compagner <[EMAIL PROTECTED]>
> wrote:
>
> > Ok i guess if if quickly look at the code.
> > If you dont do your own converter then it defaults i guess to the
> > DefaultConverter
> > that does this:
> >
> > public Object convertToObject(String value, Locale locale)
> >        {
> >            if (value == null)
> >            {
> >                return null;
> >            }
> >            if ("".equals(value))
> >            {
> >                if (((Class)type.get()) == String.class)
> >                {
> >                    return "";
> >                }
> >                return null;
> >            }
> >
> > So if it is a String class and the input is "" it does return ""
> >
> > we could change this:
> >
> > final IConverter converter = getConverter(getType());
> >            try
> >            {
> >                convertedInput = converter.convertToObject(getInput(),
> > getLocale());
> >            }
> >
> > in FormComponent..
> > If it is of Type String then after the conversion we still check for the
> > convert empty to null and do that..
> >
> > Because now that boolean is of no use if you are setting the Type
> >
> > johan
> >
> > johan
> >
> >
> > On Mon, Mar 31, 2008 at 2:34 PM, Johan Compagner <[EMAIL PROTECTED]>
> > wrote:
> >
> > > if you are setting the type The converter is called and not
> > > convertValue()
> > > i am still not really happy with this but for 1.3/1.4 this is the way
> it
> > > works
> > >
> > > And i guess the String converter that does String to String doesnt óok
> > at
> > > that convert empty input to null value at all
> > >
> > > Do you have your own?
> > >
> > > johan
> > >
> > >
> > >
> > > On Mon, Mar 31, 2008 at 1:38 PM, Eric Rotick <[EMAIL PROTECTED]>
> > wrote:
> > >
> > > > I do have the type set and I've been reading WICKET-606 and I'm
> using
> > > > 1.3.2and there is no converter and convertInput is not called.
> > > >
> > > > I've now written some code to show that there is a difference.
> > > >
> > > > form.add( new TextField( "text1", new PropertyModel( this, "text1" )
> )
> > > > );
> > > > form.add( new TextField( "text2", new PropertyModel( this, "text2" )
> > > > ).setConvertEmptyInputStringToNull( true ) );
> > > > form.add( new TextField( "text3", new PropertyModel( this, "text3" )
> > > > ).setConvertEmptyInputStringToNull( false ) );
> > > > form.add( new TextField( "text4", new PropertyModel( this, "text4"
> ),
> > > > String.class ) );
> > > > form.add( new TextField( "text5", new PropertyModel( this, "text5"
> ),
> > > > String.class ).setConvertEmptyInputStringToNull( true ) );
> > > > form.add( new TextField( "text6", new PropertyModel( this, "text6"
> ),
> > > > String.class ).setConvertEmptyInputStringToNull( false ) );
> > > >
> > > > produces this
> > > >
> > > > Setting text1 to [null]
> > > > Setting text2 to [null]
> > > > Setting text3 to []
> > > > Setting text4 to []
> > > > Setting text5 to []
> > > > Setting text6 to []
> > > >
> > > > So,
> > > >
> > > >   - text1 and text2 are the same because
> > > >   setConvertEmptyInputStringToNull is true by default
> > > >   - text3 does what would be expected
> > > >   - text4 I'm not sure about
> > > >   - text5 and text6 are anomalous as either one or the other should
> > > >   produce a null
> > > >
> > > > I guess the main problem is that I'm not sure what is supposed to
> > > > happen. I
> > > > though that having set the type to String meant that the normal
> string
> > > > processing took place and setConvertEmptyInputStringToNull did the
> > job.
> > > >
> > > > As it is, I've learned more about how things work and I can overcome
> > my
> > > > problem. However, if anyone wants me to continue with this I would
> be
> > > > happy
> > > > to do so.
> > > >
> > > > Eric.
> > > >
> > > > On Fri, Mar 28, 2008 at 8:58 PM, Johan Compagner <
> [EMAIL PROTECTED]
> > >
> > > > wrote:
> > > >
> > > > > Are you sure you dont have the type set?
> > > > > Is a converter used or is convertInput called?
> > > > >
> > > > > On 3/28/08, Eric Rotick <[EMAIL PROTECTED]> wrote:
> > > > > > Hmm, it's not working for me.
> > > > > >
> > > > > > There's one other thing I spotted. The docs say that a TextField
> > > > > defaults to
> > > > > > String.class even if it cannot work out the class from the
> model.
> > My
> > > > > model
> > > > > > is not one that allows for reflection to determine the class and
> > > > > initially
> > > > > > all input to the TextField was being set as null even when there
> > was
> > > > > some.
> > > > > > As soon as I added the parameter to set the class to String it
> > > > started
> > > > > > saving strings correctly.
> > > > > >
> > > > > > I will have a look at the code to see if there's anything
> obvious.
> > > > > >
> > > > > > Eric.
> > > > > >
> > > > > > On Fri, Mar 28, 2008 at 4:37 PM, Igor Vaynberg <
> > > > [EMAIL PROTECTED]>
> > > > > > wrote:
> > > > > >
> > > > > > > TexField.setConvertEmptyInputStringToNull( true ) worked fine
> > for
> > > > me
> > > > > > > in a quickstart...
> > > > > > >
> > > > > > > -igor
> > > > > > >
> > > > > > >
> > > > > > > On Fri, Mar 28, 2008 at 8:25 AM, Eric Rotick <
> > [EMAIL PROTECTED]
> > > > >
> > > > > wrote:
> > > > > > > > I've just been reading the section on Forms and validation
> in
> > > > Wicket
> > > > > in
> > > > > > > >  Action and have tried
> > > > > > > >
> > > > > > > >     AbstractValidator av = new AbstractValidator( ) {
> > > > > > > >         protected void onValidate( IValidatable validatable
> )
> > {
> > > > > > > >             // No nothing
> > > > > > > >         }
> > > > > > > >         public boolean validateOnNullValue( ) {
> > > > > > > >             return true;
> > > > > > > >         }
> > > > > > > >     };
> > > > > > > >
> > > > > > > >  adding one of these to the TextField but still an empty
> > string
> > > > gets
> > > > > > > >  returned.
> > > > > > > >
> > > > > > > >  All I want to do is get a null string rather than an empty
> > > > string
> > > > > from
> > > > > > > a
> > > > > > > >  TextField. Has nobody had this use case?
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >  On Thu, Mar 27, 2008 at 5:02 PM, Eric Rotick <
> > > > [EMAIL PROTECTED]>
> > > > > > > wrote:
> > > > > > > >
> > > > > > > >  > I've just realised that the database is getting filled
> with
> > > > > columns
> > > > > > > of
> > > > > > > >  > empty strings which then don't cause the 'not null' test
> to
> > > > trip.
> > > > > > > >  >
> > > > > > > >  > The culprit is the TextField returning an empty string
> > rather
> > > > > than a
> > > > > > > null.
> > > > > > > >  > I can see there are some special considerations for
> > returning
> > > > a
> > > > > null
> > > > > > > and I
> > > > > > > >  > want to understand how they will effect me. However, I've
> > > > tried
> > > > > > > >  >
> > > > > > > >  > TexField.setConvertEmptyInputStringToNull( true )
> > > > > > > >  >
> > > > > > > >  > with no effect and using
> > > > > > > >  >
> > > > > > > >  > new TextField( id ) {
> > > > > > > >  > public boolean isInputNullable() {
> > > > > > > >  > regturn true;
> > > > > > > >  > }
> > > > > > > >  > };
> > > > > > > >  >
> > > > > > > >  > also with no effect.
> > > > > > > >  >
> > > > > > > >  > I'm assuming I'm not the first person to see this effect
> > and
> > > > I
> > > > > guess
> > > > > > > it's
> > > > > > > >  > lack of understanding rather than some implicit behaviour
> > but
> > > > I
> > > > > can't
> > > > > > > find
> > > > > > > >  > anything guiding on the subject.
> > > > > > > >  >
> > > > > > > >  > In this case, the string has no special formatting, it
> just
> > > > needs
> > > > > to
> > > > > > > be
> > > > > > > >  > stored verbatim in the database but the application logic
> > in
> > > > the
> > > > > > > backend
> > > > > > > >  > uses an empty string in a different way than a null
> string
> > > > and,
> > > > > yes,
> > > > > > > maybe
> > > > > > > >  > the database should also have a column check but it
> doesn't
> > > > at
> > > > > > > present.
> > > > > > > >  >
> > > > > > > >  > Any pointers?
> > > > > > > >  >
> > > > > > > >  >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > >
> ---------------------------------------------------------------------
> > > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > >
> > > > >
> > > >
> > >
> > >
> >
>

Reply via email to