【发布时间】:2011-10-09 08:46:21
【问题描述】:
我正在为 webapps 编写一个前端控制器 servlet 类。前端控制器旨在区分三种基本情况:
- 文件请求(调用
FileRequestHandler实例) - 数据请求(调用
DataRequestHandler实例) - Servlet 请求(调用
ServletRequestHandler实例)
为了测试,我想使用 Tomcat 的 DefaultServlet (javadoc,source code) 来提供文件,但我无法让它工作。问题是,即使我的FileRequestHandler 类应该正确扩展DefaultServlet,我也无法访问其受保护的方法(特别是doGet 用于处理GET 请求)。顺便说一句,这些类位于不同的包中。
代码:
public class FileRequestHandler extends DefaultServlet {
// fields
private static final long serialVersionUID = 1L;
// methods
public void setResponse(HttpServletRequest request , HttpServletResponse response, URI uri)
throws IOException, ServletException
{
/* DEBUG */try {
System.out.println("(!!) doGet >> " + DefaultServlet.class.getMethod("doGet",new Class[]{HttpServletRequest.class,HttpServletResponse.class}) ) ;
doGet(request,response) ;
/* DEBUG */}
/* DEBUG */catch(Exception e) { System.out.println("(!) " + this.getClass( ).getName( ) + " >> buildResponse >> " + e.toString( ) ) ; }
}
}
堆栈跟踪:
(指向 NullPointer 的部分)
在 org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:741) 在 org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:398) 在 org.pulse.web.FileRequestHandler.buildResponse(FileRequestHandler.java:39)
更新:
据我所知,我可能需要澄清前端控制器 servlet 将拦截所有 HttpRequests(web.xml 中的<url-pattern>/</url-pattern>),因此由 servlet 容器实例化的 DefaultServlet 将不会收到任何请求。
我现在在前端控制器类中明确调用了DefaultServlet#init:
FileRequestHandler fileRequestHandler = new FileRequestHandler( ) ;
fileRequestHandler.init( ) ;
现在我得到一个 404 Servlet 不可用。
更新2:问题——事实证明——实际上是扩展类使用不足的后续问题,而不是继承的直接问题。
我添加的用于检测问题根源的日志帖子将引发。如果我省略它,我会得到一个NoSuchMethodException。NullPointerException。
它看起来如此简单。我仍然无法让它按照我想要的方式工作。有什么想法、建议或见解?
TIA,
FK
【问题讨论】:
标签: java inheritance methods subclass protected