Java Servlet エラー ~フォワードできません

フォワードできません

以下のようなエラーが出ました。

java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません

未入力の場合、リクエストスコープにエラーメッセージをリクエストスコープに保存して画面をフォワードしたときに上記のエラーが出ました。

具体的なコードは以下のようなものです。

/** POSTリクエスト */
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request
        , HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String text = request.getParameter("text");

    // 入力チェック
    if (text == null || "".equals(text)) {
        System.out.println("*** in Error ***");
        // エラーメッセージをリクエストスコープに設定
        request.setAttribute("errorMsg", "つぶやきが入力されていません");
        // フォワード
        forwardMain(request, response);
    }
    ServletContext application = this.getServletContext();
    // アプリケーションスコープ
    List<Mutter> mutterList =
            (List<Mutter>)application.getAttribute("mutterList");
    // セッションスコープ
    HttpSession sess = request.getSession();
    // ユーザークラス
    User user = (User) sess.getAttribute("loginUser");
    // つぶやきリストに追加
    Mutter mutter = new Mutter(user.getName(), text);
    new PostMutterLogic().execute(mutter, mutterList);
    // アプリケーションスコープに保存
    application.setAttribute("mutterList", mutterList);
    // フォワード
    forwardMain(request, response);
}

private void forwardMain(HttpServletRequest request
        , HttpServletResponse response) throws ServletException, IOException{
    // フォワード
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
    dispatcher.forward(request, response);
}

エラーの原因を探る

元々エラー処理、パラメータの入力チェックを行っていなかったところにエラー処理if (text == null || "".equals(text)) {を入れ、フォワードするように実装しました。
原因部分はここになるのですが、調べてみると。下の処理を2回行っているところがありました。

    // フォワード
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
    dispatcher.forward(request, response);

まとめ

2回フォワードしているのでエラーになったということでした。。。

でわでわ。。。

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にエラーがないか確認

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

でわでわ。。。

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はあるけど何とか成功しました。

でわでわ。。。

Eclipse Gluon 画面サイズ〜Gradleの起動が止まる〜

開発作業中にまた遭遇しました。バグです。

Viewクラスを継承してViewを作成しているのですが、画面のサイズを取得したくて以下の様なコードを追加したところGradleの起動が途中で止まってしまう現象に遭遇しました。

this.getParent().getLayoutBounds().getWidth();

クラスの実装は大雑把にこんな感じです。

public class BasicView extends View {
    ・
    ・
    ・
   public String getCSS() {
      double width = this.getParent().getLayoutBounds().getWidth();
      ・
      ・
      ・
   }
}

問題のコードを使用しなかった場合、問題なく起動します。

原因は不明、とりあえず箱のコードを使用しない様にして回避しています。

でわでわ。。。

追記

ちなみに、画面のサイズを取得するのは以下の様なコードで取得できました。

MobileApplication.getInstance().getGlassPane().getWidth()



Eclipse Gluon〜Launching Gradle tasks failed〜

またしても表題の様なエラーが出ました。

事件が起きた状況

作業場所を移動して、近場のスーパー銭湯は休憩所にて端末を立ち上げて作業開始した時(インターネットには未接続)Gradleでアプリを起動したら以下の様にエラーが出ました。

「ん〜何がいけないんだ〜?」と悩んでいたところ、以下の様な周りの声が聞こえました。

「ここってWifi入らないんだよね〜?」

「ん?そーいえば、インターネットに接続していないな、エラーもなんかダウンロードできないとか言ってるし。。。」と気がついたので、環境を移し再度Webに接続後Gradleを実行したところ問題なく起動しました。

結論

インターネット環境のないところでGradleを起動しても動かない。

自分が使用しているものだけかもしれませんが、Mavenでもウェブ上からダウンロードしてくる様なものがあるときは当然動かないでしょう。。。


これにて一件落着。。。

でわでわ。。。







Eclipse Gluon 〜Task ‘run’ not found in root project〜

表題の様なエラーが出てアプリケーションが動かなくなりました。

作成したプロジェクトをGitに公開したら動かなくなった。。。

  1. 自分の端末上で動いたのを確認したのでGitへPUSH
  2. 再度アプリを起動

こんな手順で起動したら動かなくなりました。下の様なエラーメッセージです。

org.gradle.internal.exceptions.LocationAwareException: Task 'run' not found in root project

エラーは下の様なGradle Executionビューの赤い部分(これは直した後なので緑です。。。)

ここの赤くなっている部分を右クリックするとエラーメッセージを見ることができます。

現状では、エラーがないので下の様になります。

肝心の解決策

上の様な画面にてエラーがあったGradleプロジェクトを右クリック

※今回jはJankenGameプロジェクトを右クリックしました。
 Gradleで生成されるプロジェクトは「XXX」と「XXXApp」プロジェクトの2つが
 あるので「XXX」プロジェクトを右クリック→Propertiesを選択する

そうしてGradleタスクのrunを起動すると治りました。









Java Maven 〜POMファイルの${xxx.xxx}の値〜

「{$XXX.XXX}」の値に関して

以下のPOMファイルの赤い字の部分の値は何を指すのかわかりませんでした。

  <build>  ....  </build>
  <dependencies>
   <dependency>
      <groupId>org.nd4j</groupId>
      <artifactId>nd4j-native-platform</artifactId>
      <version>${nd4j.version}</version>
    </dependency>
</dependencies>

{$XXX.XXX}の様な記載はどこかのプロパティを参照するのはわかっていたのですが、プロジェクトが大きくなるとどこにそのプロパティがあるかわからなくなります。今回はND4Jを使用してプロジェクトを作成していたのでその時に気がつきましたのでここにメモしておきます。

MavenBuildのエラー

[ERROR] 'dependencies.dependency.version'
        for org.nd4j:nd4j-native-platform:jar
      must be a valid version but is 
        '${nd4j.version}'. @ line 40, column 15

 上の様な絵エラーが出てビルドができませんでした。そしてうまくいく方との比較で以下の記載がないことに気がつきました。

  <properties>
   <nd4j.version>0.9.1</nd4j.version>
  </properties>

なんとかビルドに成功。

つまるところ。。。

POMファイルの参照関係(親子関係)のあるファイル内に「${XXX.XXX}」が存在するはず、大きいプロジェクトの時はJARなどのファイル内にあるかも?









Java Properties 〜プロパティファイルが読めない〜

プロパティファイルのロードができない!こんな感じでつまづきました。

<ソース>

Properties prop = new Properties();
try {
	prop.load(getClass().getResourceAsStream(PROPERTIES_FILE_PATH));
} catch (IOException ie) {
	ie.printStackTrace();
	System.exit(-1);
}

このソースで「PROPERTIES_FILE_PATH」に「resources/views.properties」と指定していたのですが、ロードできない。。。

PROPERTIES_FILE_PATH = "resources/views.properties";

「views.properties」でもダメだった。。。

PROPERTIES_FILE_PATH = "views.properties";

/views.properties」ならオッケーだった。



ちゃんちゃん(笑)









Java エラー: メイン・クラス〜EclipseでMainメソッドが動かない〜

以下のようなエラーメッセージが出ました。

エラー: メイン・クラスzenryokuservice.mathkit.MathKitが見つからなかったかロードできませんでした

パッケージ名もあってるし、メインメソッドの書き方も間違っていない。。。

犯人はお前だぁ!

コンパイル後のパッケージ名と起動しようとしているクラスのパッケージが違っているためだと思ったが、それでもダメでした。

とりあえずEclipse再起動

治りました(笑)

でもbinフォルダを削除したまま再作成されていない。。。

  1. JavaFXプロジェクトで作成した時には「bin」フォルダがあった
  2. Mavenプロジェクトに変更
  3. Mainクラスを作成(MathKit.java)し起動
  4. エラー
  5. Eclipse再起動
  6. 治った!!

こんな感じの流れでした。JavaFXプロジェクトとMavenプロジェクトの変換の時の問題であろう。。。

予想の領域は出ないが、ここから先はMavenの範疇なので、調査は止めることにします。

適当なとこで、作業をストップする事もメリハリをつけるという意味で大切なことです。そうしたないと、ズルズルと夜遅くまでやる事になります…

「あっ、XXXさんまだいたの?ちょっと、これお願いしていい?」と言われる可能性大です(笑)

でわでわ。。。









Java Maven Error 〜-source 7以降を使用してください〜

Mavenの実行時エラーに以下のような文言が出た時の対処

(リテラル内のアンダースコアを使用可能にするには、-source 7以降を使用してください)
(ラムダ式を使用可能にするには、-source 8以上を使用してください)
(try-with-resourceを使用可能にするには、-source 7以降を使用してください)

これは単純にコンパイラーのバージョンが古いのでバージョンをあげてください。。。と言うことですが、「Eclipseの設定ではJava8使ってるのに?」とか不明点があり少しハマりました。

Mavenで使用するデフォルトのコンパイラー(JDK)のバージョンが古いのが原因でした。

なので以下のようにプロパティを追加してやればOK