Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-1450

Ajax Re-render does not work after AbstractRestartResponseException()

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.3.2
    • 1.3.5
    • wicket
    • None
    • Windows XP Java 1.6.0_05-b13

    Description

      To handle possible exception in Model#getObject(): I do

      1) make note of exception has occurred (and subsequently only return some error value and not cause exception thrown again),
      2) register an error feedback message,
      3) calll page.detach() (for clean up and reset?, I'm not sure but I know this makes FeedbackPanelErrorMessage reload message from session) and
      4) throw new AbstractRestartResponseException() to re-render response with the new error message from the model shown.

      I'm finding that this works perfectly in non-Ajax. But in Ajax, there are 2 problems:

      1) the error message register in step 2) above is not rendered in the FeedbackPanel
      2) the Ajax response is incomplete, it's missing the label component in my test case and missing the </ajax-response> closing tag.

      Test case below: if you enter "blowup" in the text field, the label's model will do the steps outline above. Run this in non-Ajax and you will see two error messages as expected. Run in Ajax, you will see the problem (open Wicket Ajax Debug panel to see).

      = = = = HomePage.html:

      <html>
      <head></head>
      <span wicket:id="message">message will be here</span>
      <form wicket:id="form">
      <input type="text" wicket:id="word"/>
      <input type="submit" value="Enter" wicket:id="submitButton"/>
      </form>
      <span wicket:id="feedback">FEEDBACK</span>
      </html>

      = = = = = HomePage.java:

      public class HomePage extends WebPage {

      private static final long serialVersionUID = 1L;

      private String word;

      public HomePage(final PageParameters parameters) {

      add(new FeedbackPanel("feedback") {
      private static final long serialVersionUID = 1L;
      @Override protected void onBeforeRender()

      { System.out.println("= = = = FeedbackPanel onBeforeRender()"); System.out.println(" FeedbackbackMessageModel = " + getFeedbackMessagesModel().getObject()); super.onBeforeRender(); }

      }.setOutputMarkupPlaceholderTag(true));
      // if the word "blowup" is entered,
      //this register a error message and throw
      IModel model = new Model() {
      private static final long serialVersionUID = 1L;
      @Override public Object getObject() {
      if (word != null && word.equals("blowup")) {
      word = "-w-e-b-l-e-w-u-p-";
      HomePage.this.fatal("[2/2]This message is from Model.");
      getPage().detach();
      System.out.println("! ! ! ! ! throwing new AbstractRestartResponseException()");
      throw new AbstractRestartResponseException()

      { private static final long serialVersionUID = 1L; }

      ;
      } else

      { return "The word is: \"" + (word == null ? " n u l l " : word) + "\""; }

      }
      };
      add(new Label("message", model) {
      private static final long serialVersionUID = 1L;
      @Override protected void onBeforeRender()

      { System.out.println("= = = = Label onBeforeRender(), model = " + getModel().getObject()); super.onBeforeRender(); }

      }.setOutputMarkupId(true));
      Form form = new Form("form", new CompoundPropertyModel(this));
      add(form);
      form.add(new TextField("word").setRequired(true));
      AjaxFallbackButton submitButton = new AjaxFallbackButton("submitButton", form) {
      private static final long serialVersionUID = 1L;
      @Override protected void onSubmit(AjaxRequestTarget target, Form f) {
      if (word != null && word.equals("blowup"))

      { HomePage.this.error("[1/2]This message is from onSubmit. There should also be a message from model"); }

      if (target != null)

      { target.addComponent(HomePage.this.get("feedback")); // clear error feedback if any target.addComponent(HomePage.this.get("message")); }

      }

      @Override protected void onError(AjaxRequestTarget target, Form f)

      { target.addComponent(HomePage.this.get("feedback")); // show updated error feedback }

      };
      form.add(submitButton);
      }
      }

      = = = = = WicketApplication.java:

      public class WicketApplication extends WebApplication
      {
      public WicketApplication() {
      }

      public Class<? extends WebPage> getHomePage()

      { return HomePage.class; }

      @Override public RequestCycle newRequestCycle(Request request, Response response) {
      return new WebRequestCycle(this, (WebRequest) request, (WebResponse) response) {
      @Override public Page onRuntimeException(Page page, RuntimeException e) {
      // page can be null
      if (page == null)

      { return super.onRuntimeException(page, e); }

      return page;
      }
      };
      }

      }

      Attachments

        Activity

          People

            jcompagner Johan Compagner
            matthewyoung Matthew Young
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: