Wicket
  1. Wicket
  2. WICKET-1450

Ajax Re-render does not work after AbstractRestartResponseException()

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.3.2
    • Fix Version/s: 1.3.5
    • Component/s: wicket
    • Labels:
      None
    • Environment:
      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;
      }
      };
      }

      }

        Activity

        Hide
        Artur Wronski added a comment -

        The same problem is in Wicket 1.3.4

        Show
        Artur Wronski added a comment - The same problem is in Wicket 1.3.4
        Hide
        Johan Compagner added a comment -

        the responses where not correctly reset when doing a abort when there is already content in the buffers

        Show
        Johan Compagner added a comment - the responses where not correctly reset when doing a abort when there is already content in the buffers
        Hide
        Martijn Dashorst added a comment -

        The unit tests fail after this issue was fixed. I'm not sure if the unit tests fail because this issue was fixed wrong, or that the test has a bug, or that the test tests the wrong thing.

        This issue is now blocking 1.3.5

        Show
        Martijn Dashorst added a comment - The unit tests fail after this issue was fixed. I'm not sure if the unit tests fail because this issue was fixed wrong, or that the test has a bug, or that the test tests the wrong thing. This issue is now blocking 1.3.5
        Hide
        Johan Compagner added a comment -

        test was wrong, WebResponse didnt know it was in Ajax mode.

        Show
        Johan Compagner added a comment - test was wrong, WebResponse didnt know it was in Ajax mode.

          People

          • Assignee:
            Johan Compagner
            Reporter:
            Matthew Young
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development