Hi Manuel,
On 8/06/2010 06:52, Manuel Chinea wrote:
> i have the following problem using paging dataproviders. If the
> PagingDataProvider.size() throws an Exception, the click servlet doesn't
> redirect to the configured error page. It looks like it sees the
> exception as some sort of parsing error (velocity?). It only redirects
> the exceptions thrown by the page lifecycle methods. I have put
> together a simple test case, like this:
Your conclusion is correct, once the HttpServletResponse starts writing data to
its output stream
Click cannot change the response to the ErrorPage.
The fix would be to invoke Table#getRowList during the onRender event to ensure
any exceptions are
thrown *before* rendering the response. This can be done in the Page#onRender
or a custom
Table#onRender.
I think this will be a good enhancement for the next release of Click.
Kind regards
Bob
> a.- IndexPage.java
>
> public class IndexPage extends Page {
> @Bindable
> public Table table = new Table("table");
>
> public IndexPage() {
> table.setDataProvider(new PagingDataProvider() {
> public int size() {
> if (Math.random() > 0.5d) { //to simulate an exception
> throw new RuntimeException(); // (*1)
> }
> return 1;
> }
>
> public Iterable getData() {
> // TODO Auto-generated method stub
> ArrayList arrayList = new ArrayList();
> arrayList.add(new Object());
> return arrayList;
> }
> });
> table.addColumn(new Column("hashCode"));
> }
>
> @Override
> public void onRender() {
> if (Math.random() > 0.5d) {
> throw new RuntimeException(); //(*2)
> }
> super.onRender();
> }
> }
>
> b.- click.xml
>
> <click-app charset="UTF-8">
> <pages package="xyz" autobinding="annotation">
> <page path="/click/error.htm" classname="TheErrorPage" />
> </pages>
> <mode value="debug" />
> </click-app>
>
>
> c.- TheErrorPage.java
>
> public class TheErrorPage extends ErrorPage {
>
> }
>
> d.- /click/error.htm
>
> "this is an error page"
>
> e.- index.htm
>
> Hello, index page here...now with the table...
>
> $table
>
> --------------------------
>
>
>
> When this code runs, and throws the RuntimeException() in (*1), the
> rendered page is the index page, but the table rendering prints a error
> box. But when the random value is lower than 0.5, the onRender is
> executed, and the RuntimeException() (*2) it throws, gets the click
> servlet to redirect to the error page.
>
> Is there any way to fix this?
>
>
> --
> Manuel Chinea.