如何在Jersey

时间:2015-11-30 05:10:51

标签: java jax-rs

当我抛出一个Throwable时,我希望在我的硬盘驱动器上保存请求信息以进行调试。这是可能的?

例如:

@Provider
public class DefaultExceptionMapper implements ExceptionMapper<Throwable> {

    @Override
    public Response toResponse(Throwable exception) {
        exception.printStackTrace();

        JSONObject msg = new JSONObject();
        msg.put("msg", "Try again.");

        // i need something like this

        JSONObject request = SuperEspecialClass.getActualRequest().parseToJSON();
        request.saveOnHardDriveForDebugLater();

        /**request contains -> all headers
        request contains -> all parameters
        request contains -> body 
        request contains -> method
        request contains -> URI

        like this :

        {
            url : '/url',
            method : '',
            headers : [],
            params : [],

            body : ''
        }*/

        return Response
                .serverError()
                .entity(msg)
                .build();
    }

}
带有@Context HttpServletRequest

表格参数消失了。身体不可能与request.getReader()结合。

1 个答案:

答案 0 :(得分:0)

可能没有官方API可以再次获取输入参数,这意味着再次读取请求InputStream。

您可以实现一个 Interceptor ,它会在继续处理请求之前保存方法参数,并在发生异常时检索它们。您必须特别注意拦截器的线程安全性:您不希望混合来自不同请求的异常和参数。 另请注意,在请求的反序列化,验证或匹配期间可能会出现异常,在这种情况下,您根本就没有参数。