我创建了一个在每个未捕获的异常之后都会调用的方法,并响应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",
])
答案 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>"