Java Servlet Filter ~画面遷移しない~

イントロダクション

Java ServletでFilterの実装を祖小名いました。

    <filter>
        <filter-name>docoFilter</filter-name>
        <filter-class>filter.DocoFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>docoFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>
@Override
public void init(FilterConfig filterConfig) throws ServletException {
    log = Logger.getLogger("logFilter");

    log.info("*** フィルター処理開始");
}

@Override
public void destroy() {
    log.info("*** フィルター処理終了");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    log.info("** Before doFilter ");
    log.info("ContentType: " + request.getContentType());
    log.info("** Url: " + req.getRequestURI());

    long start = System.currentTimeMillis();
    System.out.println("Milliseconds in: " + start);
    chain.doFilter(request, response);
    long end = System.currentTimeMillis();
    log.info("** After doFilter / " + (end - start));
}

初回のリクエストは問題なく、初期画面が表示されるが、次のログイン後の画面が表示されない。。。

下のような実装をしました。

    @Override
    protected void doGet(HttpServletRequest request
            , HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        String pass = request.getParameter("pass");

        // ユーザークラス
        User user = new User(name, pass);
        // ログイン処理
        LoginLogic logic = new LoginLogic();
        boolean isLogin = logic.execute(user);

        if (isLogin) {
            HttpSession sess = request.getSession();
            sess.setAttribute("loginUser", user);
        }
        System.out.println("LoginServlet");
        // フォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/loginResult.jsp");
        dispatcher.forward(request, response);
    }
    }
    @Override
    protected void doPost(HttpServletRequest request
            , HttpServletResponse response) throws ServletException, IOException {

    }

原因

ズバリ、doGetとdoPostのメソッドを間違えた。。。

確認した内容

  1. doFilterを実装していたので、Filterにエラーがあると思ったが、問題なく。。。
  2. 画面の遷移先URLが正しいか確認
  3. 表示先のJSPにエラーがないか確認

結局のところは、凡ミスでした。。。。

でわでわ。。。

XAMMP Error: Apache shutdown unexpectedly.

XAMMPが動かない

Error: Apache shutdown unexpectedly.
This may be due to a blocked port, missing dependencies,
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums

上記のようなエラーがありました。Windowsでの実施になります。

これに対して、はコマンド・プロンプトで下のようなコマンドを実行

C:\xampp\apache\bin\httpd.exe -d C:\xampp\apache

つまるところは、XAMMPのフォルダにある「apache」の中にある「bin」フォルダの
「http.exe」を実行すれば、具体的なエラーメッセージが主tくできる。

次のようなコマンドでもよい

cd XAMMPヘのパス
cd apache
cd bin
httpd.exe -d ドキュメントルートのパス

自分の場合は、ドキュメントルートに指定したフォルダがないというエラーメッセージがあった(httpd.cnf)のでそれを修正しました。もちろん解決できました。

MySQLの場合

この場合は、XAMMPのフォルダにある「mysql_start.bat」と実行するとまともなエラーメッセージが得られる。

cd XAMMPヘのパス
mysql_start.bat

これで、対象の部分を修正すれば動くと思われる。

java.lang.UnsatisfiedLinkError: Can’t load library

Can't load library

表題のようなエラーが出ました。

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.UnsatisfiedLinkError: Can't load library: jdk1.8.0_265\jre\bin\jfxwebkit.dll
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1820)
        at java.lang.Runtime.load0(Runtime.java:810)
        at java.lang.System.load(System.java:1088)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoader.java:201)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:94)
        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:39)
        at com.sun.webkit.WebPage.lambda$static$0(WebPage.java:133)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.webkit.WebPage.<clinit>(WebPage.java:132)
        at javafx.scene.web.WebEngine.<init>(WebEngine.java:881)
        at javafx.scene.web.WebEngine.<init>(WebEngine.java:868)
        at javafx.scene.web.WebView.<init>(WebView.java:273)
        at application.Main.start(Main.java:49)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
        ... 1 more
Exception running application application.Main
Caused by: java.lang.UnsatisfiedLinkError: Can't load library: D:\Apps\jdk1.8.0_265\jre\bin\jfxwebkit.dll
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1820)
        at java.lang.Runtime.load0(Runtime.java:810)
        at java.lang.System.load(System.java:1088)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoader.java:201)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:94)
        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:39)
        at com.sun.webkit.WebPage.lambda$static$0(WebPage.java:133)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.webkit.WebPage.<clinit>(WebPage.java:132)
        at javafx.scene.web.WebEngine.<init>(WebEngine.java:881)
        at javafx.scene.web.WebEngine.<init>(WebEngine.java:868)
        at javafx.scene.web.WebView.<init>(WebView.java:273)
        at application.Main.start(Main.java:49)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
        ... 1 more

実行環境

Eclipseで作成したJavaFXアプリケーションをJarファイルに出力して実行したときのエラーです。
ライブラリが参照できていないようです。

参照できていないライブラリは以下のようなものでした。

jdk1.8.0_265\jre\bin\
- jfxwebkit.dll
- fxplugins.dll
- glib-lite.dll
- gstreamer-lite.dll
- jfxmedia.dll
- jfxwebkit.dll

これは、JDKにJavaFXが梱包されているJDK corret(Amazon)なら問題ないようです。

そんなにてこずらずに解決できました。

でわでわ。。。

Maven エラー ~execute but there is no POM in this directory (/home/pi/repos)~

but there is no POM

ラズパイでMavenを使用してgithubから作成したプログラムをダウンロードしようとしたところ表題のようなエラーが出ました。

エラーメッセージ

he goal you specified requires a project to execute but there is no POM in this directory (/home/pi/repos). Please verify you invoked Maven from the correct directory. -> [Help 1]

こちらのサイトでは、POMファイルのあるディレクトリで実行すればOKみたいなことを記載していたので、そのようにしました。

そしたら次のようなエラーに代わりました。

Unknown lifecycle phase "pom.xml". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]

mvn clean

とりあえずは、一度きれいにしたほうが良いと思い、「mvn clean」コマンドを実行

どうやら、成功したようです。

mvn default

次に、通常のビルドをかけようと考え、上記の「mvn default」を実行しました。
リモートデスクトップ環境なのとラズパイ2なので、まぁ遅いです。。。
※インストールしているOSはRaspberry Desltopです。。。

そして、出力されたエラーは下のようなものです。

Unknown lifecycle phase "default". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]

初めに出たエラーと同様なものです。つまりは、mvn XXXXのXXXX部分が不適切であろうという判断ができます。

そんなわけで、初めに実行したコマンドから「pom.xml」を取り除き再度実行しました。以下のコマンドです。

mvn install

EclipseプロジェクトのMaven化

IntelliJ IDEA

IntelliJ IDEA でのMavenプロジェクト作成方法

mvn install

改めて、上記のコマンドを実行したところWarninngはあるけど何とか成功しました。

でわでわ。。。

Java テスト JUnitクラスが見つかりません with Spring Boot

JUnit5が起動できないエラーの対処方法です。

自分が実装している環境は以下の通りです。

  • IDE=Eclipse
  • SpringBootプロジェクト
  • JUnit5ライブラリを使用
実装したコード(テスト対象クラス)
public class Lesson5 {
    /**
     * シンプルなメソッド定義、メンバメソッドとスタティックメソッドの実装
     */
    public void code5_1() {
        System.out.println("湊さん、こんにちは");
    }
}
テストクラス
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class Lesson5Test {
    private static Lesson5 target;

    @BeforeAll
    public static void init() {
        target = new Lesson5();
    }

    @Test
    public void code5_1Test() {
        target.code5_1();
    }
}

まず結論としては、Springframeworkのアプリケーションで実装するクラスでないとうまくいかないというところです。つまりは、Springフレームワークのアノテーションをつけたクラスのテストでないとうまく動かないという事です

そして、自分の目的としては単純に単体テストを実行したいだけなので、SpringBootは不要だというところです。

今は使わないけど、後々にSpringBootの機能を使用したいのでこの様なつくりになっています。

単体テストを行うのにJUnit5で行おうとしたけども、「JUnitクラスが見つかりません。」という文言がポップアップされてテストが動きませんでした。

なので、JUnit5ではなく、JUnit4を使用するように修正しました。

具体的には、使用している以下のクラスを次のものに変更しました。
<変更前>
org.junit.jupiter.api.Test;

<変更後>
org.junit.Test

修正後JUnitクラス
import org.junit.BeforeClass;
import org.junit.Test;

public class Lesson5Test {
    private static Lesson5 target;

    @BeforeClass
    public static void init() {
        target = new Lesson5();
    }

    @Test
    public void code5_1Test() {
        target.code5_1();
    }
}

これでJUnitが動くようになります。無理をしてJUnit5を使用する必要はどこにもありませんでした。

そして、おかしなことに改めてJUnit5のコードに直したらうまく動きました。
ちなみに、@SpringBootアノテーションを消して実装していますが、これも「JUnitクラスが見つかりません」というポップアップが表示されました。

public class Lesson5Test {
    private static Lesson5 target;

    @BeforeAll
    public static void init() {
        target = new Lesson5();
    }

    @Test
    public void code5_1Test() {
        target.code5_1();
    }
}

ふしぎな。。。