[英]How do I get a subclass to use a parent class' protected methods?
我正在为 webapps 编写一个前端 controller servlet class。 正面 controller 旨在区分三种基本情况:
FileRequestHandler
实例)DataRequestHandler
实例)ServletRequestHandler
实例) 为了测试,我想使用 Tomcat 的DefaultServlet
( javadoc , 源代码)来提供文件,但我无法让它工作。 问题是即使我的FileRequestHandler
class 应该正确扩展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 的部分)
at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:741) at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:398) at org.pulse.web.FileRequestHandler.buildResponse(FileRequestHandler .java:39)
更新:
我可能需要澄清一下,前面的 controller servlet 将拦截所有 HttpRequests,(web.xml 中的<url-pattern>/</url-pattern>
)大意是由 servlet 容器实例化的 DefaultServlet 将不会接收任何请求,如据我所知。 我现在在前面的 controller class 中明确调用了DefaultServlet#init
:
FileRequestHandler fileRequestHandler = new FileRequestHandler( ) ;
fileRequestHandler.init( ) ;
现在我最终得到一个 404 Servlet 不可用。
更新 2 :问题 - 事实证明 - 实际上是扩展 class 使用不足的后续问题,而不是 inheritance 的直接问题。
我添加到日志中以检测问题根源的帖子将引发
. 如果我省略它,我会得到一个NoSuchMethodException
。
NullPointerException
。
它看起来如此简单。 我仍然无法让它按照我想要的方式工作。 有什么想法、建议或见解吗?
TIA,
FK
Class.getMethod
返回公共方法 - 没有这样的公共方法,因此例外。 您可以使用getDeclaredMethod
获取非公共方法。
目前尚不清楚为什么在没有日志记录的情况下尝试它时会收到NullPointerException
- 如果您可以发布更完整的堆栈跟踪,它可能会更清楚。
编辑:从DefaultServlet 的源代码来看,这是引发异常的行:
CacheEntry cacheEntry = resources.lookupCache(path);
但这并没有多大意义,因为init()
在这种情况下应该抛出异常......在您的日志中还有其他报告错误吗?
为了从超类调用受保护的方法,您不必做任何特别的事情。 事实上,由于您没有在您的 servlet 中重写doGet()
,因此它的doGet()
方法实际上应该是超类方法。 除了正常调用它之外,您不必做任何特别的事情,例如:
public void setResponse(HttpServletRequest request , HttpServletResponse response, URI uri)
throws IOException, ServletException {
doGet(request,response) ;
}
如果您愿意,可以将doGet(request,response)
替换为super.doGet(request,response)
,但在这种情况下没有任何区别,因为您没有在子类中覆盖doGet()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.