EHCache和DropWizard:没有回复

时间:2015-02-12 04:12:07

标签: jersey ehcache dropwizard

我已成功将SimplePageCachingFilter与DropWizard集成。

然而,有一件事阻碍了我。每当我的应用程序中的异常被抛出,而不是被路由到我的ExceptionMapper时,我的API浏览器中出现“Response contains no data”。我也碰巧在日志中看到了这个传递。 WARN [2015-02-12 04:06:21,768] net.sf.ehcache.constructs.web.GenericResponseWrapper: Discarding message because this method is deprecated.

传统上我的ExceptionMapper返回适当的Json响应。

还有其他人见过类似的东西吗?

2 个答案:

答案 0 :(得分:1)

我会在第1472行的http://grepcode.com/file/repo1.maven.org/maven2/com.sun.jersey/jersey-server/1.18.1/com/sun/jersey/server/impl/application/WebApplicationImpl.java#WebApplicationImpl中放置一个断点,然后触发您的错误。

它抛出一个异常,并且异常映射器的异常映射发生在堆栈中的陷阱中。可能在ContainerResponse.mapException

希望这能让你充分了解它为什么不被召唤。

FYI。我通过在一个被触发的异常映射器中放置一个断点并查看调用堆栈来获得该代码。

答案 1 :(得分:1)

将调试器附加到DropWizard后(根据@ CAB'建议),我发现除非状态代码为200,否则CachingFilter不会写出响应。

我扩展了CachingFilter并覆盖了doFilter方法并忽略了状态检查。这似乎解决了我的问题。

@Override
protected void doFilter(final HttpServletRequest request,
                        final HttpServletResponse response, final FilterChain chain) throws Exception {
    if (response.isCommitted()) {
        throw new AlreadyCommittedException("Response already committed before doing buildPage.");
    }
    logRequestHeaders(request);
    PageInfo pageInfo = buildPageInfo(request, response, chain);

    writeResponse(request, response, pageInfo);
}