2011-07-20 23 views
0

私はwebappsのフロントコントローラサーブレットクラスを作成しています。サブクラスで親クラスの保護されたメソッドを使用するにはどうすればよいですか?

  1. ファイル要求(FileRequestHandlerインスタンスを呼び出す)
  2. データ要求(DataRequestHandlerインスタンスを呼び出す)
  3. サーブレット要求(ServletRequestHandlerインスタンスを呼び出す)
  4. :フロントコントローラは、3つの基本的なケースを区別するように設計されています

は、テストのために、私は、TomcatのDefaultServletjavadocsource code)奉仕するファイルを使用していたが、私はそれを動作させることはできません。問題は、私のFileRequestHandlerクラスが適切にDefaultServletを拡張しなければならないにもかかわらず、私は保護されたメソッド(特にGET要求を扱うためにdoGet)にアクセスできないということです。クラスは異なるパッケージbtwにあります。


コード:

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()) ; } 
    } 

} 

スタックトレース:

Oで

(一部がnullpointerに至るまで) org.apache.catalina.servlets.DefaultServlet.servlets.DefaultServlet.serveResource(DefaultServlet.java:741) (org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:398) at org.pulse.web.FileRequestHandler.buildResponse FileRequestHandler.java:39)


更新:

私は多分、フロントコントローラサーブレットは、デフォルトサーブレット効果にすべてHttpRequests、(web.xmlの<url-pattern>/</url-pattern>)を傍受することを明確にする必要がありサーブレットコンテナによってインスタンス化されても、リクエストは受信されませんsts、私が知る限り。 私は今、明示的にフロントコントローラクラスでDefaultServlet#initと呼ばれています:

FileRequestHandler fileRequestHandler = new FileRequestHandler() ; 
fileRequestHandler.init() ; 

は今、私は404サーブレットで終わる使用できません。

Update2:問題は - 実際には、継承の直接の問題ではなく、拡張クラスの不適切な使用によるフォローアップの問題です。


私は問題の根本を検出するために追加のログへの投稿は NoSuchMethodExceptionを誘発します。 。私がそれを省略すると私はNullPointerExceptionを得ます。

これはとても簡単です。まだ私はそれが私がそれを望むように動作するようにすることはできません。任意のアイデア、提案、または洞察力?

TIA、

FK

Class.getMethod

答えて

1

戻りパブリック方法 - それ故にそのようなパブリック方法、例外はありません。 getDeclaredMethodを使用すると、非公開のメソッドを取得できます。

NullPointerExceptionをロギングなしで試してみた理由が分かりません。完全なスタックトレースを投稿できる場合は、より明確になる可能性があります。

EDIT:それはこのようになりますsource code for DefaultServletから判断するには、例外をスローラインである:

CacheEntry cacheEntry = resources.lookupCache(path); 

init()が、その場合に例外をスローしている必要がありますように、しかしあまり意味がありません...あなたのログにエラーを報告する何か他に何かありますか?

+0

あなたの答えをありがとう。私は私のポストをちょっと更新します。 – FK82

+0

マイ・ポストを更新しました。 'request'も' response'もnull btwではありません。 – FK82

+0

@ FK82:どのバージョンのTomcatを使用していますか? –

1

保護されたメソッドをスーパークラスから呼び出すには、特別な操作を行う必要はありません。実際にはサーブレットでdoGet()をオーバーライドしていないので、そのdoGet()メソッドは文字通りスーパークラスメソッドである必要があります。あなたがしたい場合は、super.doGet(request,response)doGet(request,response)を置き換えることができますが、中にdoGet()をオーバーライドしていないので、それがこのケースでは違いはありませんでしょう

public void setResponse(HttpServletRequest request , HttpServletResponse response, URI uri) 
     throws IOException, ServletException { 

     doGet(request,response) ; 
} 

:あなたは次のように、通常はそれを呼び出しを超えて、特別な何かをする必要はありませんあなたのサブクラス。

+0

ええ、それも私が考えていたものです。 :-) – FK82

関連する問題