¿Cómo puedo devolver un código de estado 404 / 50x desde un Controlador Grails?


Tengo un controlador que necesita devolver una página 404 y un código de estado en ciertas condiciones. Parece que no puedo averiguar cómo hacer esto en Grails. Un compañero de trabajo recomendó este método:

response.sendError(HttpServletResponse.SC_NOT_FOUND)

Que funciona perfectamente bien, pero no es muy Grial-como. Sé que el método render de Rails toma un argumento de estado, pero el render de Grails no tiene tal funcionalidad. ¿Hay algo que me estoy perdiendo, cuál es la mejor manera de lograr esto?

Author: Jack Chu, 2009-09-16

4 answers

Establecer el estado de la respuesta con su propia instrucción es suficiente. No se ve demasiado feo y es bastante sencillo:

response.status = 404;

He usado esto con éxito yo mismo y he visto a otros hacerlo de esta manera también. Ya que es solo un setter, también puedes hacer otras cosas después de establecer el estado. El último estado que establezca será el que HttpServletResponse use cuando realmente envíe la respuesta al cliente.

 48
Author: Rob Hruska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-15 14:56:50

response.sendError(404) funcionará con Grails UrlMappings mientras que response.status = 404 no lo hace por alguna razón. Esto es útil si desea representar una página de error 404 personalizada, en lugar de solo enviar 404 de vuelta al navegador.

 43
Author: Thody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-21 13:22:19

No se en que versión empezó esto, pero en Grails 2.2.1 puedes hacer:

render(status: 503, text: 'Failed to do stuff.')

Http://grails.org/doc/2.2.1/ref/Controllers/render.html

 42
Author: Alex Beardsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-03 16:05:40

response.sendError y response.setStatus son las únicas dos maneras que conozco. Si usted static import HttpServletResponse, entonces no es que 'un-grails-like'.

 8
Author: leebutts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-21 13:22:50