So in getObject that is only called in the renderphase in an ajax
request you throw an restart exception? We dont really support  that
and i believe that igor had the same kind of thread a few days back.

Make a issue for this if you want.

On 3/24/08, Matthew Young <[EMAIL PROTECTED]> wrote:
> Here is my test code:
>
> 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 new
> AbstractRestartResponseException()
>         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.");     // why this is NOT render in Ajax?
>                     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);
>     }
> }
>
> Things work perfectly in non-Ajax.  But in Ajax, after 'throw new
> AbstractRestartResponseException()' in model, the Ajax response to the
> browser is wrong in two places.  1) the feedback component don't have the
> second message register in the model, only the message from onSubmit(target)
> show. 2) the Ajax response is missing the second half:  no Label component
> and the </ajax-response> end tag.
>
> ===== This is the normal Ajax response copy from the debug panel:
>
> INFO: Received ajax response (257 characters)
> INFO:
> <?xml version="1.0" encoding="UTF-8"?><ajax-response><component
> id="feedback4" ><![CDATA[<span id="feedback4">
>
> </span>]]></component><component id="message1" ><![CDATA[<span
> id="message1">The word is: "bla"</span>]]></component></ajax-response>
> INFO: Response parsed. Now invoking steps...
> INFO: Response processed successfully.
>
> ===== This is the Ajax response after 'throw new
> AbstractRestartResponseException()':
>
> INFO: Received ajax response (339 characters)
> INFO:
> <?xml version="1.0" encoding="UTF-8"?><ajax-response><component
> id="feedback4"  encoding="wicket1" ><![CDATA[<span id="feedback4">
>   <ul>
>     <li class="feedbackPanelERROR">
>       <span class="feedbackPanelERROR">[1/2]^This message is from onSubmit.
> There should also be a message from model</span>
>     </li>
>   </ul>
> </span>]]></component>
> ERROR: Error while parsing response: Could not find root <ajax-response>
> element
> INFO: Invoking post-call handler(s)...
> INFO: Invoking failure handler(s)...
>
> From tracing the wicket code, I just don't see how this can be.  I see
> AjaxResponseTarget#response() is called again, and
> response.write("</ajax-response>");
> is called on line 539.  But in the end the Ajax response is wrong.
>
> What is wrong?  Is this a bug?
>
>
> Here is the WicketApplication for the non-Ajax case:
>
> 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;
>             }
>         };
>     }
>
> }
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to