如何通过json暴露play framework 1.2.7中的内部错误消息id?

Posted

技术标签:

【中文标题】如何通过json暴露play framework 1.2.7中的内部错误消息id?【英文标题】:How to expose the internal error message id in play framework 1.2.7 via json? 【发布时间】:2013-12-06 08:55:43 【问题描述】:

播放框架 1.2.7 应用程序提供 javascript 前端。几乎两层之间的所有消息都作为 JSON 字符串进行交换。现在我需要将 500 个错误(可能还有其他错误)从 html 更改为 JSON。

我将 app/views/error.html 更改为

#if play.mode.name() == 'DEV'
  
   "msg": "500 exception",
   "verbose": "missing",
   "type":   "$exception?.class.name",
   "message": "$exception?.message?.replace("\"", "\\\"")"
  
#/if
#else
  "msg": "500 exception"
#/else

但这缺少内部异常 ID,这在检查日志时很有用:

09:49:54,419 ERROR ~ 

@6gfb83i26
Internal Server Error (500) for request GET /test/500

Execution exception (In /app/controllers/Application.java around line 332)
NullPointerException occured : null

为了调试目的,我需要更改 @6gfb83i26 出现在前端的消息中吗?另外,有没有办法重写 #500 exception / 来编写 JSON 而不是 HTML?

【问题讨论】:

【参考方案1】:

最简单的方法是使用@Catch 拦截器。

这是一个包含此拦截器的示例控制器:

public class InternalErrorController extends Controller 

    @Catch
    public static void handleExceptions(Throwable e) 
        if (e != null) 
            String result = " status: 500, msg: '" + e.getMessage() + "', errId: 1 ";
            response.status = 500;
            renderJSON(result);
        
    

之后,对于您要为其返回有关错误的 JSON 状态的每个控制器,您应该添加以下内容:

@With(InternalErrorController.class)
public class Application extends Controller 

    public static void index() 
        throw new RuntimeException("Test exception");
    


这应该可以解决您的问题。

【讨论】:

以上是关于如何通过json暴露play framework 1.2.7中的内部错误消息id?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Play 以 JSON 形式返回验证错误!框架

Play Framework 2.4.1:如何从 JsArray 中移除元素

Scala + Play Framework + Slick - Json 作为模型字段

Play Framework Secure Module:登录JSON响应接口

Play Framework - 上传文件后响应 JSON (multipartFormData)

Scala Play Framework 2.6密封特征格式给Json