in a real app people will be invested in fixing the issue and not
having someone else do their homework for them :)

like i said, right now we consider errors in models unrecoverable - eg
you go to an error page. seemed to satisfy everyone for 3? years that
wicket has been out.

that said, you can get a little creative and come up with something.
stuff below should work with regular requests, havent tested it with
ajax yet.


-igor

        public abstract static class ErrorAwareModelAdapter
                        implements
                                IModel,
                                IComponentAssignedModel,
                                IWrapModel
        {
                private boolean error = false;
                private final IModel delegate;
                private Component component;

                public ErrorAwareModelAdapter(IModel delegate)
                {

                        this.delegate = delegate;
                }

                /** gets value that should be returned from
getobject() if exception is thrown */
                protected Object getErrorResult()
                {
                        return null;
                }

                /** handles the error - such as
component.getsession().error(e.getmessage()); */
                protected void handleError(RuntimeException e)
                {

                }

                @Override
                public Object getObject()
                {
                        if (error)
                        {
                                error = false;
                                return getErrorResult();
                        }
                        else
                        {
                                try
                                {
                                        return delegate.getObject();
                                }
                                catch (RuntimeException e)
                                {
                                        error = true;
                                        handleError(e);
                                        component.getPage().detach();
                                        throw new 
AbstractRestartResponseException()
                                        {
                                        };
                                }
                        }
                }


                @Override
                public void setObject(Object object)
                {
                        delegate.setObject(object);
                }


                @Override
                public void detach()
                {
                        delegate.detach();
                }


                @Override
                public IWrapModel wrapOnAssignment(Component component)
                {
                        this.component = component;
                        return this;
                }


                @Override
                public IModel getWrappedModel()
                {
                        return delegate;
                }

        }


On Thu, Mar 20, 2008 at 2:48 PM, Matthew Young <[EMAIL PROTECTED]> wrote:
> Then what? In real app, the model is calling some flakey remote service that
>  can fail.  Is there no way to show error message on the same page?  That the
>  only thing is put up a different error page?
>
>
>
>  On Thu, Mar 20, 2008 at 1:29 PM, Matej Knopp <[EMAIL PROTECTED]> wrote:
>
>  > This doesn't work because the model.getObject method is only called
>  > when the value is pulled out of the model, which is on label render.
>  > Even if you refresh it on ajax request, it might be too late because
>  > the feedback panel retrieves the feedback messages in onBeforeRender
>  > (before actual rendering).
>  >
>  > -Matej
>  >
>  > On Wed, Mar 19, 2008 at 10:04 PM, Matthew Young <[EMAIL PROTECTED]> wrote:
>  > >  I register an error to the page in the model but the feedback message
>  > >  doesn't show in FeedbackPanel.  Only the error message register in
>  > >  onSubmit() event handler shows.  Please have a look.  Thanks!
>  > >
>  > >  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
>  > >
>  > >  import ...
>  > >
>  > >  public class HomePage extends WebPage {    private static final long
>  > >  serialVersionUID = 1L;
>  > >
>  > >     private String word;
>  > >
>  > >     public HomePage(final PageParameters parameters) {
>  > >
>  > >         add(new
>  > >  FeedbackPanel("feedback").setOutputMarkupPlaceholderTag(true));
>  > >         // if the word 'blowup' is entered, this model register a error
>  > >  message to the page
>  > >         IModel model = new Model() {            private static final
>  > long
>  > >  serialVersionUID = 1L;
>  > >             @Override public Object getObject() {
>  > >                 if (word != null && word.equals("blowup")) {
>  > >                     word = "-b-l-o-w-u-p-";
>  > >                     HomePage.this.fatal("This message is from model.");
>  > >                     return "BAD THING HAPPENED IN MODEL";
>  > >                 } else {
>  > >                     return "The word is: \"" + (word == null ? " n u l l
>  > " :
>  > >  word) + "\"";
>  > >                 }
>  > >             }
>  > >         };
>  > >         add(new Label("message", model).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("This message is from onSubmit.
>  > >  There should also be a message from model");
>  > >                 }
>  > >                 if (target != null) {
>  > >                     target.addComponent(HomePage.this.get("feedback"));
>  > >                     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);
>  > >     }
>  > >  }
>  > >
>  >
>  >
>  >
>  > --
>  > Resizable and reorderable grid components.
>  > http://www.inmethod.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]

Reply via email to