Guys - thanks for your continued help with this, but I'm still having some
problems with:
"Attempt to set model object on null model of component."
I now have some code cut down to the simplest possible example (attempting
to follow the advice given already):
public class AreaChoiceModel extends LoadableDetachableModel {
protected Object load() {
return ((WholSession) Session.get()).getAreaList();
}
}
public class WholSession extends WebSession {
private IModel areaModel = new AreaChoiceModel();
public WholSession(Request request) {
super(request);
}
protected void onDetach() {
areaModel = null;
}
public IModel getAreaModel() {
return areaModel;
}
public List<Area> getAreaList() {
return ((WholApplication) getApplication()).getAreas();
}
}
public class PanelSearch extends FormComponentPanel {
public PanelSearch(String id) {
super(id, ((WholSession) Session.get()).getAreaModel());
add(new SearchForm("searchForm"));
add(new FeedbackPanel("feedback"));
}
private class SearchForm extends Form {
public SearchForm(String id) {
super(id);
DropDownChoice areas = new DropDownChoice("areas",
((WholSession)
Session.get()).getAreaModel(), new
ChoiceRenderer("name", "id"));
areas.setOutputMarkupId(true);
add(areas);
}
protected void onSubmit() {
System.out.println("onSubmit called");
};
}
}
Page with panel and form loads OK with selection box populated with my top
level Area list (I've removed everything else).
Clicking the button results in the error:
WicketMessage: Method onFormSubmitted of interface
org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component
[MarkupContainer [Component id = searchForm, page =
sds.whol.wicket.pages.Index, path =
0:panelSearch:searchForm.PanelSearch$SearchForm, isVisible = true,
isVersioned = false]] threw an exception
Root cause:
java.lang.IllegalStateException: Attempt to set model object on null model
of component: panelSearch:searchForm:areas
at org.apache.wicket.Component.setModelObject(Component.java:2850)
I'm obviously still missing something important here (or maybe I've cut out
too much code :-}). I suspect it's something very simple, so any further
pointers welcome.
Note - I've now bought the Wicket In Action eBook, so may have this worked
out once I've had time to study it in some detail.
Thanks again.
Michael O'Cleirigh wrote:
>
> Hello,
>
> This error happens because the intermediary panel between the form and
> the drop down choice does not have a model.
>
> Changing the PanelSearch constructor to call super (id, new Model())
> should fix the problem.
>
> You might also want your form panel to extend FormComponentPanel instead
> to get better validation support.
>
> Mike
>> Or you did not set the model on the dropdown.
>>
>> Maurice
>>
>> On Thu, Feb 21, 2008 at 8:44 PM, Maurice Marrink <[EMAIL PROTECTED]>
>> wrote:
>>
>>> Looks like at least one of the models in the session is not properly
>>> initialized.
>>> You have to do something like
>>> private IModel model=new WhateverModel(null);
>>> in your session.
>>>
>>> Maurice
>>>
>>>
>>>
>>> On Thu, Feb 21, 2008 at 8:41 PM, steviezz <[EMAIL PROTECTED]>
>>> wrote:
>>> >
>>> > Now getting
>>> >
>>> > RequestCycle.logRuntimeException(1399) | Attempt to set model object
>>> on null
>>> > model of component: panelSearch:form:parentAreas
>>> > java.lang.IllegalStateException: Attempt to set model object on null
>>> model
>>> > of component: panelSearch:form:parentAreas
>>> > at
>>> org.apache.wicket.Component.setModelObject(Component.java:2850)
>>> >
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > Mr Mean wrote:
>>> > >
>>> > > Don't add wicket components to the session, use models.
>>> > > for example
>>> > > class MySession extends WebSession
>>> > > {
>>> > > private IModel dropdown1=new WhateverModel(null); //etc for the
>>> others
>>> > > // add getters() for models
>>> > > }
>>> > >
>>> > > class PanelSearch extends Panel
>>> > > {
>>> > > public PanelSearch(String id)
>>> > > {
>>> > > super(id);
>>> > > add(new
>>> > >
>>> DropDownChoice("dropdown1",((MySession)Session.get()).getDropdown1(),myChoices)
>>> > > }
>>> > > }
>>> > >
>>> > > class SomePage extends WebPage
>>> > > {
>>> > > public SomePage()
>>> > > {
>>> > > super();
>>> > > add(new PanelSearch("search"));
>>> > > }
>>> > > }
>>> > >
>>> > > The trick is always using the shared models in your session, that
>>> is
>>> > > why you don't need setters for them and you have to initialize
>>> them
>>> > > properly with some default.
>>> > > That way the form automatically writes the new values to your
>>> session
>>> > > and you don't have to do that manually.
>>> > >
>>> > > How much less code can you have?
>>> > >
>>> > > Maurice
>>> > >
>>> > > On Thu, Feb 21, 2008 at 1:44 PM, steviezz
>>> <[EMAIL PROTECTED]>
>>> > > wrote:
>>> > >>
>>> > >> Thanks.
>>> > >>
>>> > >> I have already moved to using the session for storage. I've
>>> tried just
>>> > >> adding the complete search panel object to the session in the
>>> search
>>> > >> onsubmit() and fetching it again to add to the results page -
>>> this works
>>> > >> and
>>> > >> avoids some of my page reload and history issues (but adds a few
>>> > >> others),
>>> > >> but I presume its not really a good idea to store large object
>>> graphs in
>>> > >> the
>>> > >> session - maybe better to just store the selected values and
>>> rebuild the
>>> > >> selection dropdowns as required. Plus, this will probably help
>>> me iron
>>> > >> out
>>> > >> my inconsistent dropdown state problems.
>>> > >>
>>> > >> But I'm still searching for a magic solution that does not
>>> involve
>>> > >> writing
>>> > >> too much code :-}
>>> > >>
>>> > >>
>>> > >>
>>> > >>
>>> > >>
>>> > >> Mr Mean wrote:
>>> > >> >
>>> > >> > I would not recommend what you are doing here.
>>> > >> > What happens is that wicket removes the panel from the
>>> original page
>>> > >> > and attaches it to the new page, making it impossible to use
>>> the
>>> > >> > backbutton (because wicket will complain about a missing
>>> component).
>>> > >> > Also this only works if the html of the new page uses the same
>>> > >> > component id.
>>> > >> >
>>> > >> > It is better to store the selection for your dropdowns in the
>>> session
>>> > >> > (as suggested before).
>>> > >> > Then in the constructor of your PanelSearch you can check if
>>> the
>>> > >> > session contains a value for the dropdowns and if that is the
>>> case set
>>> > >> > it as the model for the dropdown. That way you don't have to
>>> pass the
>>> > >> > state to every page.
>>> > >> >
>>> > >> > Maurice
>>> > >> >
>>> > >> > On Thu, Feb 21, 2008 at 11:35 AM, steviezz
>>> <[EMAIL PROTECTED]>
>>> > >> > wrote:
>>> > >> >>
>>> > >> >> Answering my own questions.
>>> > >> >>
>>> > >> >> I can also pass the search panel to the results page from my
>>> form
>>> > >> >> onSubmit:
>>> > >> >>
>>> > >> >> setResponsePage(new
>>> > >> >> SearchResults(((PanelSearch)this.getParent()),
>>> > >> >> search));
>>> > >> >>
>>> > >> >> Then, in the results page:
>>> > >> >>
>>> > >> >> public SearchResults(PanelSearch searchPanel, Search
>>> search) {
>>> > >> >> add(searchPanel);
>>> > >> >> }
>>> > >> >>
>>> > >> >> Mostly seems to work OK - panel on results page retains
>>> state from
>>> > >> >> search
>>> > >> >> page.
>>> > >> >>
>>> > >> >> Still getting some weird behaviour with the Ajax dropdowns
>>> on page
>>> > >> >> refreshes
>>> > >> >> - can get crazy state of North America, Canada, Kansas if I
>>> refresh
>>> > >> the
>>> > >> >> page
>>> > >> >> between selection changes (old state gets mixed in with
>>> partial new
>>> > >> >> state)
>>> > >> >>
>>> > >> >> Other thing to sort is how to reload panel state if user
>>> goes back
>>> > >> to
>>> > >> >> the
>>> > >> >> home page (containing search panel) via a basic external
>>> navigation
>>> > >> link
>>> > >> >> -
>>> > >> >> panel will be in its initial blank state. Perhaps I do need
>>> to look
>>> > >> >> into
>>> > >> >> loading from the session for this.
>>> > >> >>
>>> > >> >> But I'm starting to like Wicket - this kind of stuff takes
>>> much more
>>> > >> >> code in
>>> > >> >> other frameworks.
>>> > >> >>
>>> > >> >>
>>> > >> >>
>>> > >> >>
>>> > >> >> steviezz wrote:
>>> > >> >> >
>>> > >> >> > I am now passing the search form model to the new page in
>>> the
>>> > >> >> constructor,
>>> > >> >> >
>>> > >> >> > setResponsePage(new SearchResults(search));
>>> > >> >> >
>>> > >> >> > Works OK - I assume this is better than going through the
>>> session.
>>> > >> >> >
>>> > >> >> > But I have no idea (yet) how to reinitialise the search
>>> panel Ajax
>>> > >> >> > widgets.
>>> > >> >> >
>>> > >> >> >
>>> > >> >> >
>>> > >> >> >
>>> > >> >> > wicket user-2 wrote:
>>> > >> >> >>
>>> > >> >> >> store the backing model in the session and get it from
>>> the
>>> > >> session,
>>> > >> >> this
>>> > >> >> >> will help you retain the state in all the cases
>>> > >> >> >>
>>> > >> >> >> Cheers
>>> > >> >> >> Dipu
>>> > >> >> >>
>>> > >> >> >>
>>> > >> >> >>
>>> > >> >> >
>>> > >> >> >
>>> > >> >>
>>> > >> >> --
>>> > >> >> View this message in context:
>>> > >> >>
>>> > >>
>>> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15607263.html
>>> > >> >>
>>> > >> >>
>>> > >> >> Sent from the Wicket - User mailing list archive at
>>> Nabble.com.
>>> > >> >>
>>> > >> >>
>>> > >> >>
>>> > >>
>>> ---------------------------------------------------------------------
>>> > >> >> 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]
>>> > >> >
>>> > >> >
>>> > >> >
>>> > >>
>>> > >> --
>>> > >> View this message in context:
>>> > >>
>>> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15610292.html
>>> > >>
>>> > >>
>>> > >> Sent from the Wicket - User mailing list archive at Nabble.com.
>>> > >>
>>> > >>
>>> > >>
>>> ---------------------------------------------------------------------
>>> > >> 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]
>>> > >
>>> > >
>>> > >
>>> >
>>> > --
>>> > View this message in context:
>>> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15618707.html
>>> >
>>> >
>>> > Sent from the Wicket - User mailing list archive at Nabble.com.
>>> >
>>> >
>>> >
>>> ---------------------------------------------------------------------
>>> > 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]
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
--
View this message in context:
http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15632887.html
Sent from the Wicket - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]