QA@IT

エラー解決(java.awt.HeadlessException:)

9067 PV

現在、Centos7でWebサーバーを構築してTomcatでアプリケーションを動かしています。

アプリケーションはWindows7/Eclipseで作成したものを.warファイルにし、サーバー上のTomcatに配備しています。

任意の動作をしたときに以下のようなエラーページが出力されます。
_____.PNG

このページの[java.awt.HeadLessException:]を検索にかけて、調べたのですが、いまいち解消方法を理解できていません。
参照URL:enter link description here

Tomcatの起動スクリプト$ vim /usr/local/tomcat/bin/catalina.sh に追記するとのことですが、この文章以下の
$ export CATALINA_OPTS="-Djava.awt.headless=true"
↑この文章が理解できません
catalina.sh ファイルの中の一番下の行に
$ export CATALINA_OPTS="-Djava.awt.headless=true"
この一行を追記するということでしょうか?

JavaサーブレットでJOptionPaneを使っているため、この周辺でエラーが出力されているようです。

package servlet;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import model.HistoryDeleteLogic;

@WebServlet("/HistoryDelete")
public class HistoryDelete extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();                                     // セッションを取得するための準備
        int logId;                                                                          // ログインIDを保存しておくための変数
        StringBuffer urlBuffer = request.getRequestURL();                                   // 変数 urlBuffer に現在のページのURLを格納する(ただし、?以降のパラメータ情報は取得できない)
        String url = urlBuffer.append("?").append(request.getQueryString()).toString();     // 先ほど取得したURL文字列の後ろに、現在のパラメータ情報をドッキングする
        int indexOfParam = url.indexOf("=");                                                // パラメータ付きURLかどうかを調べる(=マークがあるかどうか)
        if(session.getAttribute("loginUser") != null && indexOfParam != -1) {
            logId = Integer.parseInt(url.substring(indexOfParam + 1));                      // =マークから先を切り取り、取得した文字列を変数 logId に格納する(int型へキャスト)
            HistoryDeleteLogic hdl=new HistoryDeleteLogic();
            List<Integer> list = hdl.act(logId);
            int result;
            JFrame frame = new JFrame();
        Properties prop = System.getProperties ();
            prop.put ("java.awt.headless", "false");
            Object[] options = { "はい", "いいえ" };
            frame.setAlwaysOnTop(true);
            result = JOptionPane.showOptionDialog(frame, "削除してもよろしいですか?", "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
            switch (result) {
                case JOptionPane.OK_OPTION:
                    hdl.execute(logId);
                    JFrame frame2 = new JFrame();
                    Properties prop2 = System.getProperties ();
                    prop.put ("java.awt.headless", "false");
                    Object[] options2 = { "はい" };
                    frame2.setAlwaysOnTop(true);
                    JOptionPane.showOptionDialog(frame2, "削除しました", "Information", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options2, options2[0]);
                case JOptionPane.NO_OPTION:
                case JOptionPane.CANCEL_OPTION:
                default:
                    session.setAttribute("year", list.get(0));
                    session.setAttribute("month", list.get(1));
                    session.setAttribute("weightHistoryLength", null);
                    response.sendRedirect("/bodyMassIndex/History");
                    break;
            }
        }
        else {
            response.sendRedirect("/bodyMassIndex/");
        }

    }

}

JFrame frame = new JFrame();

上記のコードで500エラーが表示されてしまっています。

解消方法をご教授願います。

  • osにGUI環境が無いためだと思いますが、そもそもなぜWebアプリケーションでGUIを使おうとしているんですか? -
  • 確認ダイアログを使いたかったためですが、ローカル環境以外ではJFrameが使えないということを知りませんでした。
    JavaScriptでも確認ダイアログを作成できるようですので、JavaScriptで確認ダイアログを作り直そうと思います。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。