Search code examples
formsgrailshttp-redirectgroovygsp

grails form redirect gives 404, but url mapping works


I feel like I've entered the Twilight Zone. I have a Grails form that redirects to a URL, but gives a 404. If I go directly to that exact URL, everything works fine (that is, the URL mappings are correct).

This is an example generated form tag:

<form action="/alm/contactRefresh/itemRefreshProcess/7070" method="post">

On submit, it redirects to:

http://localhost:8080/alm/contactRefresh/itemRefreshProcess/7070

But gives this error:

HTTP ERROR 404
Problem accessing /alm/contactRefresh/itemRefreshProcess/7070. Reason:
NOT_FOUND
Powered by Jetty://

But then if I just go directly to that same URL (by focusing the browser Location bar and pressing enter), the page renders just fine, though the form params are lost because it's just a GET now. I've also tried changing the form method to GET, and that doesn't work either (throws a 404).

I've done similar forms a zillion times before with no problems. I'm sure this is some stupid user error, but I seriously can't figure out what's wrong.

Thanks for any ideas!


Solution

  • So, I finally started ripping parts out of the form and found out that for some reason you can’t name a Grails checkbox starting with the word "action". It must be something related to the default params["action"] entry. Though my checkbox names were a concatenation of "action_" + an id.

    Anyway, there was some kind pre-processing of the checkbox form params that was blowing up before making it to the controller, and somehow that translated to a 404 instead of an actual Exception.

    Originally I had this:

    <g:checkBox name="action_${serviceRefreshAction.id}" value="${true}" />
    

    Which renders this:

    <input type="hidden" name="_action_7196" /><input type="checkbox" name="action_7196" checked="checked" id="action_7196"  />
    

    I changed "action" to "myAction", like this:

    <g:checkBox name="myAction_${serviceRefreshAction.id}" value="${true}" />
    

    Which renders this:

    <input type="hidden" name="_myAction_7206" /><input type="checkbox" name="myAction_7206" checked="checked" id="myAction_7206"  />
    

    And now everything works fine.

    Five hours of my life down the drain.

    But I guess I have to forgive Grails, for the all time it saves me on a daily basis normally. :o)