Я пишу класс сервлета фронт-контроллера для веб-приложений. Фронт-контроллер предназначен для различения трех основных случаев:
- Запрос файла (вызов экземпляра
FileRequestHandler
)
- Запрос данных (вызов экземпляра
DataRequestHandler
)
- Запрос сервлета (вызов экземпляра
ServletRequestHandler
)
Для тестирования я хотел использовать Tomcat DefaultServlet
( javadoc , исходный код ) для обслуживания файлов, но я не могу заставить его работать. Проблема в том, что, хотя мой класс 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( ) ) ; }
}
}
Трассировка стека:
(часть, ведущая к нулевому указателю)
at 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)
Обновление:
Мне, возможно, придется уточнить, что сервлет фронт-контроллера будет перехватывать все запросы Http (<url-pattern>/</url-pattern>
в web.xml) о том, что DefaultServlet, создаваемый контейнером сервлета, не будет получать запросы, насколько я могу судить.
Я сейчас явно назвал DefaultServlet#init
в классе фронт-контроллера:
FileRequestHandler fileRequestHandler = new FileRequestHandler( ) ;
fileRequestHandler.init( ) ;
Теперь я получаю сервлет 404 недоступно.
Update2: Проблема, как выясняется, на самом деле является дополнительной проблемой с неадекватным использованием расширенного класса, а не с прямой проблемой наследования.
Пост в журнале, который я добавил для определения корня проблемы, вызовет NoSuchMethodException
. . Если я опущу это, я получу NullPointerException
.
Это выглядит очень просто. Тем не менее я не могу заставить его работать так, как я хочу. Любые идеи, предложения или идеи?
ТИА
FK