代码之家  ›  专栏  ›  技术社区  ›  pkalinow

如何绕过AEM默认错误处理?

  •  0
  • pkalinow  · 技术社区  · 3 年前

    是否可以从运行在AEM中的Sling servlet直接返回带有自定义内容的HTTP错误响应?

    背景

    有一个Slingservlet,用于处理使用POST方法发送的表单。

    @SlingServlet(
        methods = HttpConstants.METHOD_POST,
        resourceTypes = NameConstants.NT_PAGE,
        selectors = SELECTOR)
    public class MyServlet extends SlingAllMethodsServlet {
    //...
        @Override
        protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) {
            //if something is wrong with the request
            Gson gson = new Gson();
            gson.toJson(errorResponse, response.getWriter());
            response.setContentType(MediaType.JSON_UTF_8.toString());
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            //...
        }
    //...
    }
    
    

    当它返回HTTP400BadRequest时,我想获得在servlet中创建的JSON响应。相反,AEM返回一个HTML页面,该页面是用/apps/sling/servlet/errorhandler生成的,只是在内容的开头添加了JSON。

    {"errors":["The provided value is incorrect"]}
    
    
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
        <head><title>400 Bad Request</title></head>
        <body> 
                        <h1>400 Bad Request</h1>
                        <p>Cannot serve request to on this server.</p>
    (...)
        </body>
    </html>
    

    我知道可以创建自定义错误页面。问题是,我需要servlet中的验证错误来创建有意义的错误响应。

    AEM版本:6.5

    0 回复  |  直到 3 年前
        1
  •  1
  •   Alexander Berndt    3 年前

    只需使用response.setStatus(…),而不是response.sendError(…)。

    所以只要打电话:

    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);