Rob, This is because a property model provides certain metadata (when available); E.g. When the property model points to a field, it provides the type of field. Even when the model value is null this type information is still available.
Since this metadata is not available when using lambdas wicket uses a default (String). The reason it also works with a regular Model is because you provide a value; thus, wicket can detect the type based on the value. When your lambda does not return a value, wicket cannot detect the type. // Bas Verstuurd vanaf mijn iPhone > Op 4 okt. 2017 om 16:58 heeft Rob Audenaerde <[email protected]> het > volgende geschreven: > > We are preparing for migration to Wicket 8 (when it comes out). So we are > already replacing our old PropertyModels with a backported LambdaModel (we > use the implementation from Wicket 8). > > I noticed an odd behavior where the RangeValidator gets an empty String > from the input (in validatable.getValue()) if the input is not an integer > (for example, changing '2' to '2e' in the textfield). > > This results in a class cast exception. > > If I replace the Lambdamodel by a IModel<Integer> = new Model<Integer>(2) > it works fine. > > After adding the type Integer.class to the NumberTextField it works fine > again. > > Am I doing something wrong? > > Thanks! > > Here is the relevant code (see commented section): > ------ > > public class HomePage extends WebPage { > private static final long serialVersionUID = 1L; > > static class MyInt implements Serializable > { > Integer i=2; > > public Integer getI() { > return i; > } > > public void setI(Integer i) { > this.i = i; > } > } > public HomePage(final PageParameters parameters) { > super(parameters); > > IModel<MyInt> myInt = new Model(new MyInt()); > IModel<Integer> intModel = LambdaModel.of(myInt, MyInt::getI, MyInt::setI); > Form f = new Form("f") { > > }; > //Next commented line does not work if you change the input for '2' to '2e' > and click outside the input box. > //NumberTextField ntf = new NumberTextField<>("tf", intModel); > NumberTextField ntf = new NumberTextField<>("tf", intModel, Integer.class); > ntf.setOutputMarkupId(true); > ntf.setMinimum( 1 ).setStep( 1 ); > ntf.add( new OnChangeAjaxBehavior() > { > private static final long serialVersionUID = 1L; > > @Override > protected void onUpdate( AjaxRequestTarget target ) > { > System.out.println("changed!"); > } > } ); > f.add(ntf); > add(f); > > } > } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
