正在调用Servlet的服务和init方法,但在扩展ZuulServlet时不会调用doGet

时间:2016-01-20 15:04:53

标签: java servlets netflix-zuul

在我开始之前,我会说,我已经看过类似的问题Servlet's service and init method are being called, but not doGet 但是这个对我很有帮助。 这里需要注意的是我的servlet类扩展 com.netflix.zuul.http.ZuulServlet (由于特定原因进行路由),而在服务方法中我调用 super.service(servletRequest) ,servletResponse); 。当我执行http get调用时,我看到我的service()方法被调用但是doGet()方法没有被调用但是作为响应我得到一个“HTTP / 1.1 200 OK”没有任何正文当然是我的doGet()方法不发送。以下是我的代码段。

public class AppHealthServlet extends ZuulServlet {
@Override
public void init() throws ServletException {
    super.init();
    logger.info("AppHealthServlet called ");
    message = "pong";
}

@Override
public void service(ServletRequest servletRequest,
                    ServletResponse servletResponse) throws ServletException, IOException {
    logger.info("AppHealthServlet service called ");
    try {
        RequestContext.getCurrentContext().set("health", true);
        super.service(servletRequest,servletResponse);
    } finally {
        logger.info("AppHealthServlet service done ");
    }
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.doGet(req, resp);
    logger.info("AppHealthServlet doGet called ");
    // Set response content type
    resp.setContentType("text/html");
    PrintWriter out = resp.getWriter();
    out.println("<h1>" + message + "</h1>");
    resp.setStatus(AppHealthServlet.SC_OK);
}
}

如果有人能帮助我弄明白我在哪里做错,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

看起来ZuulServlet并不意味着像这样使用。如果您查看ZuulServlet.service所做的源代码,它基本上将所有内容移交给ZuulRunner

在我看来,您需要深入研究Zuul路由,而不是尝试自己扩展ZuulServlet