メソッド参照の非常に奇妙な動作を観察します。Web アプリとサーブレット階層のチェーンがあります。サーブレット A が拡張する サーブレット B が拡張するHttpServlet
(これが必要な理由は見落としておきましょう)。
Web アプリは Tomcat/Java 8 (web.xml version="3.1" metadata-complete="true") でホストされています。私のローカル ラップトップ (Tomcat 8.0.35 または 8.5.15、Java 8 Update 131、OSX) では、このようなサーブレット コードのスタック オーバーフローが観察されます。
public class A extends B {
@Override
protected void service(HttpServletRequest pRequest, HttpServletResponse pResponse) throws ServletException, IOException {
ServletCommon.servletServiceWrapper(pRequest, pResponse, super::service);
}
}
スタック オーバーフロー (以下を参照) は非常に疑わしいように見えます。階層にクラス B がまったく含まれていません。クラス A はHttpServlet
直接呼び出します (なぜ!? そして、どのようにこれが可能になるのか!!!????)。
同時に、ラムダを使用したコードは正常に機能します。
public class A extends B {
@Override
protected void service(HttpServletRequest pRequest, HttpServletResponse pResponse) throws ServletException, IOException {
ServletCommon.servletServiceWrapper(pRequest, pResponse, (t, u) -> super.service(t, u));
}
}
ラッパーには、非常に単純なコードも含まれています。
public class ServletCommon {
@FunctionalInterface
public interface MyBiConsumer<T, U>{
void accept(T t, U u) throws ServletException, IOException ;
}
public static void servletServiceWrapper(HttpServletRequest request, HttpServletResponse response,
MyBiConsumer<HttpServletRequest, HttpServletResponse> pDelegate) throws ServletException, IOException {
pDelegate.accept(request, response);
}
}
スタックトレース
java.lang.StackOverflowError
ServletA.lambda$service$0(ServletA.java:19)
ServletCommon.servletServiceWrapper(ServletCommon.java:31)
ServletA.service(ServletA.java:19)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
ServletA.lambda$service$0(ServletA.java:19)
ServletCommon.servletServiceWrapper(ServletCommon.java:31)
ServletA.service(ServletA.java:19)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
...
何か案は?
間違ったservice()
メソッド (ServletRequest
保護されたメソッドではなく で公開されているメソッド)をどうにか呼び出しようとしているためHttpServletRequest
、無限ループが発生します。ただし、あなたのコード例は、それが起こっている理由を示すのに十分明確ではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加