如何在grails响应上添加状态消息

时间:2019-02-28 15:47:55

标签: grails groovy

我创建了一个在每个未捕获的异常之后都会调用的方法,并响应gson视图:

void handleError(){
        respond([status: 500, view: "/customErr"], [
                code      : 500,
                message   : "whatever internal error",
        ])
}

这正常工作,但是我的主要问题是我的客户端(另一个充当客户端的服务器)正在接收状态为500的http响应,但状态消息为null。我检查了回复文档,但没有看到属性消息或其他内容。 如果我的客户收到以下信息:

wslite.rest.RESTClientException: 500 null

,并且该null为未由grails设置的响应状态消息 如何在回复中添加详细信息?像这样的田园诗般的东西:

  respond([status: 500, statusMessage: "my custom 
    message", view: "/customErr"], [
                code      : 500,
                message   : "whatever internal error",
        ])

3 个答案:

答案 0 :(得分:2)

grails使用Servlet API’s HttpServletResponse来构建response

现在检查HttpServletResponse类的Java文档。

只有两种方法来定义状态消息:

  • void setStatus(int sc, String msg) 已弃用。从2.1版本开始,由于message参数的含义不明确。要设置状态代码,请使用setStatus(int),要发送带有说明的错误,请使用sendError(int,String)。
  • void sendError(int sc, String msg)使用指定的状态向客户端发送错误响应,并清除缓冲区。服务器默认创建响应,使其看起来像一个 HTML格式的服务器错误页面,其中包含指定的消息,并将内容类型设置为“ text / html”。

不推荐使用第一个。第二个发送状态消息,但不会发送正文-主要用于致命错误...

因此,根据servlet文档的正式规定,无法同时发送消息和消息作为响应。


这个问题很棘手。因为根据Apache Tomcat,将从版本9开始删除“自定义状态消息”功能:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html#Other

但是根据RFC2616 sec 6.1.1:此处列出的原因只是建议-可以用本地等效项替换,而不会影响协议。

答案 1 :(得分:0)

这不能直接回答您的问题,并且可能无法解决您的问题,具体取决于您对接收错误的应用程序的控制程度,但是您可以将错误消息添加到响应的标头中,该标头应传递给客户(如果知道要检查的话)。

String errorMessage = "Whatever Internal Server Error"
response.addHeader("custom-error", errorMessage)
response.sendError(500, errorMessage)

这将在标头中发送消息并作为响应消息...我不知道它是否与respond()一起工作,或者它如何与控制器中的response对象进行交互。 。但是,如果您要响应将视图呈现为错误页面,则应该能够将消息添加到model调用中包含的respond()并在错误页面上显示(至少,我认为是这样。

答案 2 :(得分:-1)

在Controller中尝试

render "<script type=\"text/javascript\">" +
                    "alert('沒有權限,將關閉此頁')" +
                                        "});" +
                    "</script>"