Hi, i have a form to add an item, i can select the type of this item from a drop down choice and accordingly the fields specific to the item will be replaced. before adding this line:
AjaxFormValidatingBehavior.addToAllFormComponents(form, "onblur"); everything worked perfectly, i would have my form validated. i'd find the items added to the database and no problem seems to appear. when i added this line to get ajax validation, after clicking on the type in the drop down choice i'd get the following warning: WARN org.apache.wicket.markup.html.form.AbstractTextComponent - Couldn't resolve model type of Model:classname=[org.apache.wicket.model.CompoundPropertyModel$AttachedCompoundPropertyModel]:nestedModel=[Model:classname=[org.apache.wicket.model.CompoundPropertyModel]:nestedModel=[Model:classname=[main.java.web.components.addedit.AddPublicationPanel$10]:attached=true:tempmodelobject=[main.java.domain.publication.arti...@745f]]] for [MarkupContainer [Component id = ISBN]], please set the type yourself. followed by this exception: WicketMessage: No get method defined for class: class main.java.domain.publication.Article expression: ISBN Root cause: org.apache.wicket.WicketRuntimeException: No get method defined for class: class main.java.domain.publication.Article expression: ISBN the weird thing is that model of the form when printed is correct. here is my .java: public class AddPublicationPanel extends BasicPanel { // services @SpringBean private IDepartmentAccessService departmentAccessService; @SpringBean private IPublicationAccessService publicationAccessService; @SpringBean private IUserAccessService userAccessService; // lists used for DropDownChoice private List<Short> listYear; private List<Byte> listMonth; // components private Form form; private FeedbackPanel feedback; private AjaxFallbackButton clear; private WebMarkupContainer detailsBook, detailsConferencePaper, detailsTechnicalReport, detailsWorkshop, detailsArticle, detailsBookChapter, detailsCurrent; private LoadableDetachableModel book, conferencePaper, technicalReport, workshop, article, bookChapter; private FormComponentFeedbackBorder publicationTypeBorder; // common fields private DropDownChoice publicationType, year, month; private TextField title, keywords; private AutoCompleteTextFieldUser[] authors; private AjaxFallbackLink addAuthor, removeAuthor; private TextArea abstractText; private ListMultipleChoice departments; private CheckBox reproducible, passwordProtected; // book details private TextField bookISBN, bookSeries, bookEdition, bookVolume, bookPublisherName, bookPublisherAddress; // conference paper details private TextField conferencePaperBookTitle, conferencePaperPages, conferencePaperPublisherName, conferencePaperPublisherAddress, conferencePaperEditors, conferencePaperAddress, conferencePaperSponsors; // technical report details private DropDownChoice technicalReportType; private TextField technicalReportInstitutionName, technicalReportInstitutionAddress; // workshop details private TextField workshopName, workshopNumber, workshopAddress; // article details private TextField articleJournalName, articleVolume, articleIssue, articlePages; // book chapter details private TextField bookChapterTitle, bookChapterISBN, bookChapterSeries, bookChapterEdition, bookChapterVolume, bookChapterPublisherName, bookChapterPublisherAddress; // custom validators private PatternValidator pagesPatternValidator, keywordsPatternValidator; public AddPublicationPanel() { super("block", "Add Publication"); initPatternValidators(); initLists(); initModels(); initCommon(); initDetails(); AjaxFormValidatingBehavior.addToAllFormComponents(form, "onblur"); } private void initCommon() { add((feedback = new FeedbackPanel("feedback")).setOutputMarkupId(true)); add(form = new Form("form", new CompoundPropertyModel(book)) { protected void onSubmit() { setPublicationAuthors(); setPublicationKeywords(); setPublicationCreationDate(); publicationAccessService.savePublication((IPublication) form .getModelObject()); detailsCurrent.setVisible(false); clearAuthors(); } }); // publicationType publicationType = new DropDownChoice("publicationType", Arrays .asList(PublicationType.values()), new ChoiceRenderer( "displayName", "id")); publicationType.setRequired(true); publicationType.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { target.addComponent(feedback); target.addComponent(detailsArticle); target.addComponent(detailsBook); target.addComponent(detailsBookChapter); target.addComponent(detailsConferencePaper); target.addComponent(detailsTechnicalReport); target.addComponent(detailsWorkshop); if (((PublicationType) publicationType.getModelObject()) == null) { detailsCurrent.setVisible(false); } else { if (((PublicationType) publicationType.getModelObject()) .getId() == 0) { replaceDetails(detailsArticle).setModel( new CompoundPropertyModel(article)); } else { if (((PublicationType) publicationType.getModelObject()) .getId() == 1) { replaceDetails(detailsBook).setModel( new CompoundPropertyModel(book)); } else { if (((PublicationType) publicationType .getModelObject()).getId() == 2) { replaceDetails(detailsBookChapter).setModel( new CompoundPropertyModel(bookChapter)); } else { if (((PublicationType) publicationType .getModelObject()).getId() == 3) { replaceDetails(detailsConferencePaper) .setModel( new CompoundPropertyModel( conferencePaper)); } else { if (((PublicationType) publicationType .getModelObject()).getId() == 4) { replaceDetails(detailsTechnicalReport) .setModel( new CompoundPropertyModel( technicalReport)); } else { if (((PublicationType) publicationType .getModelObject()).getId() == 5) { replaceDetails(detailsWorkshop) .setModel( new CompoundPropertyModel( workshop)); } } } } } } } } }); form.add((publicationTypeBorder = new FormComponentFeedbackBorder( "publicationTypeBorder")).add(publicationType) .setOutputMarkupId(true)); // addWithBorder("publicationTypeBorder", form, publicationType); // title addWithBorder("titleBorder", form, new TextField("title").setRequired( true).add(StringValidator.maximumLength(128))); // year form.add(new DropDownChoice("year", listYear)); // month form.add(new DropDownChoice("month", listMonth, new ChoiceRenderer() { @Override public Object getDisplayValue(Object object) { return (new DateFormatSymbols().getMonths())[((Byte) object) .intValue()]; } })); // abstractText addWithBorder("abstractTextBorder", form, new TextArea("abstractText") .add(StringValidator.maximumLength(2048))); // reproducible form.add(new CheckBox("reproducible")); // passwordProtected form.add(new CheckBox("passwordProtected")); // keywords addWithBorder("keywordsBorder", form, new TextField("keywords").add( keywordsPatternValidator).add( StringValidator.maximumLength(2048))); // authors (internal & external) authors = new AutoCompleteTextFieldUser[10]; for (int i = 0; i < 10; i++) { (authors[i] = new AutoCompleteTextFieldUser("author" + i)) .setOutputMarkupId(true) .setOutputMarkupPlaceholderTag(true); if (i == 0) { authors[i].setRequired(true).setVisible(true); addWithBorder("authorBorder", form, authors[0]); } else { authors[i].setVisible(false); form.add(authors[i]); } } form.add((addAuthor = (new AjaxFallbackLink("add") { @Override public void onClick(AjaxRequestTarget target) { int pointer; for (pointer = 0; pointer < 10; pointer++) { if (!authors[pointer].isVisible()) { break; } } if (pointer < 10) { authors[pointer].setVisible(true); if (pointer == 9) this.setVisible(false); if (pointer > 0) removeAuthor.setVisible(true); if (target != null) { target.addComponent(authors[pointer]); target.addComponent(removeAuthor); target.addComponent(this); } } } })).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true)); form.add((removeAuthor = (new AjaxFallbackLink("remove") { @Override public void onClick(AjaxRequestTarget target) { int pointer; for (pointer = 0; pointer < 10; pointer++) { if (!authors[pointer].isVisible()) { break; } } pointer--; if (pointer > 0) authors[pointer].setVisible(false); if (pointer == 1) this.setVisible(false); if (pointer <= 9) addAuthor.setVisible(true); if (target != null) { target.addComponent(authors[pointer]); target.addComponent(addAuthor); target.addComponent(this); } } })).setVisible(false).setOutputMarkupId(true) .setOutputMarkupPlaceholderTag(true)); // departments addWithBorder("departmentsBorder", form, new ListMultipleChoice( "departments", new LoadableDetachableModel() { @Override protected Object load() { return departmentAccessService.findAllDepartments(); } }, new ChoiceRenderer("name", "id")).setRequired(true)); // clear button form.add((new AjaxFallbackButton("clear", form) { @Override protected void onSubmit(AjaxRequestTarget target, Form form) { detailsCurrent.setVisible(false); form.clearInput(); clearAuthors(); if (target != null) { target.addComponent(form); for (AutoCompleteTextFieldUser author : authors) { target.addComponent(author); } } } }).setDefaultFormProcessing(false)); // trying ajax /* new AjaxFormValidatingBehavior(form, "onkeystroke"); */ } private void initModels() { book = new LoadableDetachableModel() { @Override protected Object load() { IBook book = new Book(); // setting default values book.setYear(new Short((short) Calendar.getInstance().get( Calendar.YEAR))); book.setPublisher(new Publisher()); return book; } }; bookChapter = new LoadableDetachableModel() { @Override protected Object load() { IBookChapter bookChapter = new BookChapter(); // setting default values bookChapter.setYear(new Short((short) Calendar.getInstance() .get(Calendar.YEAR))); bookChapter.setBookPublisher(new Publisher()); return bookChapter; } }; article = new LoadableDetachableModel() { @Override protected Object load() { IArticle article = new Article(); // setting default values article.setYear(new Short((short) Calendar.getInstance().get( Calendar.YEAR))); return article; } }; workshop = new LoadableDetachableModel() { @Override protected Object load() { IWorkshop workshop = new Workshop(); // setting default values workshop.setYear(new Short((short) Calendar.getInstance().get( Calendar.YEAR))); return workshop; } }; conferencePaper = new LoadableDetachableModel() { @Override protected Object load() { IConferencePaper conferencePaper = new ConferencePaper(); // setting default values conferencePaper.setYear(new Short((short) Calendar .getInstance().get(Calendar.YEAR))); conferencePaper.setConferenceBookPublisher(new Publisher()); return conferencePaper; } }; technicalReport = new LoadableDetachableModel() { @Override protected Object load() { ITechnicalReport technicalReport = new TechnicalReport(); // setting default values technicalReport.setYear(new Short((short) Calendar .getInstance().get(Calendar.YEAR))); technicalReport.setType(TechnicalReportType.PRIMARY_RESEARCH); technicalReport.setInstitution("GUC"); technicalReport .setInstitutionAddress("New Cairo City, El Tagamoa El Khames"); return technicalReport; } }; } private void initDetails() { // article (detailsArticle = new WebMarkupContainer("detailsArticle")).setVisible( false).setOutputMarkupId(true).setOutputMarkupPlaceholderTag( true); addWithBorder("journalNameBorder", detailsArticle, new TextField( "journalName") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("volumeBorder", detailsArticle, new TextField( "journalVolume") { @Override public void onBeforeRender() { super.onBeforeRender(); add(NumberValidator.range(0, Short.MAX_VALUE)); } }); addWithBorder("issueBorder", detailsArticle, new TextField( "journalIssue") { @Override public void onBeforeRender() { super.onBeforeRender(); add(NumberValidator.range(0, Long.MAX_VALUE)); } }); addWithBorder("pagesBorder", detailsArticle, new TextField( "journalPages") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(64)); add(pagesPatternValidator); } }); // book (detailsBook = new WebMarkupContainer("detailsBook")).setVisible(false) .setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true); addWithBorder("ISBNBorder", detailsBook, new TextField("ISBN") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.lengthBetween(10, 13)); } }); addWithBorder("seriesBorder", detailsBook, new TextField("series") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); addWithBorder("editionBorder", detailsBook, new TextField("edition") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(64)); } }); addWithBorder("volumeBorder", detailsBook, new TextField("volume") { @Override public void onBeforeRender() { super.onBeforeRender(); add(NumberValidator.range(0, Short.MAX_VALUE)); } }); addWithBorder("publisherNameBorder", detailsBook, new TextField( "publisher.name") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("publisherAddressBorder", detailsBook, new TextField( "publisher.address") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); // book chapter (detailsBookChapter = new WebMarkupContainer("detailsBookChapter")) .setVisible(false).setOutputMarkupId(true) .setOutputMarkupPlaceholderTag(true); addWithBorder("bookISBNBorder", detailsBookChapter, new TextField( "bookISBN") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.lengthBetween(10, 13)); } }); addWithBorder("bookTitleBorder", detailsBookChapter, new TextField( "bookTitle") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("seriesBorder", detailsBookChapter, new TextField( "bookSeries") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); addWithBorder("editionBorder", detailsBookChapter, new TextField( "bookEdition") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(64)); } }); addWithBorder("volumeBorder", detailsBookChapter, new TextField( "bookVolume") { @Override public void onBeforeRender() { super.onBeforeRender(); add(NumberValidator.range(0, Short.MAX_VALUE)); } }); addWithBorder("pagesBorder", detailsBookChapter, new TextField( "bookPages") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(64)); add(pagesPatternValidator); } }); addWithBorder("publisherNameBorder", detailsBookChapter, new TextField( "bookPublisher.name") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("publisherAddressBorder", detailsBookChapter, new TextField("bookPublisher.address") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); // conference paper (detailsConferencePaper = new WebMarkupContainer( "detailsConferencePaper")).setVisible(false).setOutputMarkupId( true).setOutputMarkupPlaceholderTag(true); addWithBorder("conferenceBookTitleBorder", detailsConferencePaper, new TextField("conferenceBookTitle") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("conferenceAddressBorder", detailsConferencePaper, new TextField("conferenceAddress") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); addWithBorder("pagesBorder", detailsConferencePaper, new TextField( "conferenceBookPages") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(64)); add(pagesPatternValidator); } }); addWithBorder("editorsBorder", detailsConferencePaper, new TextField( "editors") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(256)); } }); addWithBorder("sponsorsBorder", detailsConferencePaper, new TextField( "sponsors") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(512)); } }); addWithBorder("publisherAddressBorder", detailsConferencePaper, new TextField("conferenceBookPublisher.address") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); addWithBorder("publisherNameBorder", detailsConferencePaper, new TextField("conferenceBookPublisher.name") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); // technical report (detailsTechnicalReport = new WebMarkupContainer( "detailsTechnicalReport")).setVisible(false).setOutputMarkupId( true).setOutputMarkupPlaceholderTag(true); addWithBorder("typeBorder", detailsTechnicalReport, new DropDownChoice( "type", Arrays.asList(TechnicalReportType.values()), new ChoiceRenderer("displayName", "id"))); addWithBorder("institutionBorder", detailsTechnicalReport, new TextField("institution") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("institutionAddressBorder", detailsTechnicalReport, new TextField("institutionAddress") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); // workshop (detailsWorkshop = new WebMarkupContainer("detailsWorkshop")) .setVisible(false).setOutputMarkupId(true) .setOutputMarkupPlaceholderTag(true); addWithBorder("workshopTitleBorder", detailsWorkshop, new TextField( "workshopTitle") { @Override public void onBeforeRender() { super.onBeforeRender(); setRequired(true); add(StringValidator.maximumLength(128)); } }); addWithBorder("workshopNumberBorder", detailsWorkshop, new TextField( "workshopNumber") { @Override public void onBeforeRender() { super.onBeforeRender(); add(NumberValidator.range(0, Long.MAX_VALUE)); } }); addWithBorder("workshopAddressBorder", detailsWorkshop, new TextField( "workshopAddress") { @Override public void onBeforeRender() { super.onBeforeRender(); add(StringValidator.maximumLength(128)); } }); detailsCurrent = detailsBook; form.add(detailsArticle).add(detailsBook).add(detailsBookChapter).add( detailsConferencePaper).add(detailsConferencePaper).add( detailsTechnicalReport).add(detailsWorkshop); } private void initLists() { // years listYear = new ArrayList<Short>(); for (short i = (short) Calendar.getInstance().get(Calendar.YEAR); i >= 1950; i--) { listYear.add(new Short(i)); } // months listMonth = new ArrayList<Byte>(); for (byte i = 0; i < 12; i++) { listMonth.add(new Byte((byte) i)); } } private void initPatternValidators() { pagesPatternValidator = new PatternValidator( "(\\s*\\d+\\s*((\\s*-\\s*\\d+)?\\s*[,;]?\\s*))*"); keywordsPatternValidator = new PatternValidator( "(\\s*\\w+\\s*,*\\s*)*,*\\s*"); } private void addWithBorder(String id, WebMarkupContainer parent, FormComponent formComponent) { final FormComponentFeedbackBorder border = new FormComponentFeedbackBorder( id); border.setOutputMarkupId(true); border.add(formComponent); parent.add(border); formComponent.add(new AjaxFormComponentUpdatingBehavior("onkeyup") { @Override protected void onUpdate(AjaxRequestTarget target) { target.addComponent(feedback); target.addComponent(border); } }); } private Form replaceDetails(WebMarkupContainer replacement) { detailsCurrent.setVisible(false); (detailsCurrent = replacement).setVisible(true); return form; } private void setPublicationAuthors() { StringBuilder builder = new StringBuilder(); for (int i = 0; i < authors.length; i++) { if (!authors[i].isVisible()) break; if (authors[i].getModelObject() != null) { IUser user = userAccessService.getUserByFullName(authors[i] .getModelObjectAsString()); if (i != 0) { builder.append("#"); } if (user != null) { builder.append(user.getId()); ((IPublication) form.getModelObject()) .addInternalAuthor(user); } else { builder.append(authors[i].getModelObjectAsString()); } } } ((IPublication) form.getModelObject()).setAuthors(builder.toString()); } private void setPublicationKeywords() { String keywords = null; if (((IPublication) form.getModelObject()).getKeywords() != null) { keywords = ((IPublication) form.getModelObject()).getKeywords() .trim(); keywords += (keywords.charAt(keywords.length() - 1) != ',' ? "," : ""); } ((IPublication) form.getModelObject()).setKeywords(keywords); } private void setPublicationCreationDate() { ((IPublication) form.getModelObject()).setCreatedOn(new Date()); } private void clearAuthors() { for (AutoCompleteTextFieldUser author : authors) { author.clear(); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org