• ベストアンサー

ActionFormをjavacすると

以下の様な警告がでました。 ActionForm.java: package struts; import org.apache.struts.action.ActionForm; public final class AuthenticationForm extends ActionForm { private String id; private String pass; public void setId(String id) {this.id = id;} public String getId() {return id;} public void setPass(String pass) {this.pass = pass;} public String getPass() {return pass;} } # javac -cp ./struts.jar:./servlet-api.jar:. AuthenticationForm.java ---------- 1. WARNING in AuthenticationForm.java (at line 4) public final class AuthenticationForm extends ActionForm ^^^^^^^^^^^^^^^^^^ The serializable class AuthenticationForm does not declare a static final serialVersionUID field of type long ---------- 1 problem (1 warning) # 警告の意味がわからないのですが この警告の意味を教えてください。 また、この警告を回避する手段がありましたら教えてください。

  • reiman
  • お礼率73% (794/1076)
  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

英語そのままですが。 「シリアライズできるクラスはstatic final long serialVersionUIDというフィールドをもたなきゃだめ」 ってことです。 「気にするな」ってのが私の個人的な回答ですが、気になるならば JDK1.5以上なのであれば、アノテーションで @SuppressWarnings("serial") をそのクラスの前に宣言しておけばよろし。 http://www.kawaz.jp/pukiwiki/?Java%20Tips#SuppressWarnings

reiman
質問者

補足

ありがとうございます。 Javaのバージョンは1.4.2です。 以下のようにすればエラーはでなくなりましたが serialVersionUID は何に使うのでしょうか? package struts; import org.apache.struts.action.ActionForm; public final class AuthenticationForm extends ActionForm { static final long serialVersionUID=0; private String id; private String pass; public void setId(String id) {this.id = id;} public String getId() {return id;} public void setPass(String pass) {this.pass = pass;} public String getPass() {return pass;} }

その他の回答 (1)

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

>serialVersionUID >は何に使うのでしょうか? オブジェクトをシリアライズ化した際に、そのデータを別の環境で復元する時に使うID、だそうです。 オブジェクトを別のマシンなどに送信する際に、オブジェクトをシリアライズ化してそのデータを送信、 受信したマシンでシリアライズ化データを「元のオブジェクト」に復元して利用するのですが、 このとき、「本当に元のオブジェクトなのか」を厳密にしておかないとトラブルになります。 そこで、このIDをあらかじめ決めておいて、IDが復元しても同じならOK、としているようです。 serialVersionUIDが指定されていなくても、IDを持たないわけではなく、自動的に計算して付加されるようです。 クラスの情報とかいろいろ使って、(たぶん)一意に決まるようなものみたいです。 が、環境によってこの計算結果が「異なるかもしれない」らしいのです。 なので、「同じオブジェクトが違う」と言われるかもしれないので、プログラマの方でちゃんとしたものを付けておいてね、 ということのようです。 と、ここまで言ってなんですが、シリアライズ化する必要がなければ全く意味のないものですね。 ちなみに、J2SDKにはserialver.exeというものが付いていて、それで計算できるらしいです。 Eclipse使ってる人はプラグイン入れれば付けられるみたいです。 それ以外では…どうしてるんだろうか。 PED02744さんの回答のように、@SuppressWarningsを使うのが多いのかも。

reiman
質問者

お礼

大変参考になりました。 ありがとうございました。

関連するQ&A

  • スレッドセーフ?スレッドアンセーフ?

    Struts2にてスレッドセーフを勉強しており 以下のコードがスレッドセーフなのか、それともスレッドアンセーフなのかご意見を頂きたいと思います。 個人的な意見ですが、インスタンス変数を利用しているためスレッドアンセーフになるのではないかと思いますが間違いございませんでしょうか。 //以下 Struts2 public class InsertProgram extends ActionSupport implements ServletRequestAware{ private Test test = new Test(); private String id; private String name; public class execute(){ id     = request.getParameter("id"); name = request.getParameter("name");        //以下がご意見を頂きたい箇所です。 test.setId(id); test.setName(name); test.insert(); return SUCCESS; } } public class Test{ private String id; private String name; public String getId() { return id; } public String getName() { return name; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public class insert() { //割愛致します。 データベースにid 及び name をinsert します。 sql = "Insert into test_db(id , name) ・・・" } }

    • ベストアンサー
    • Java
  • java のstruts1.3です。

    java のstruts1.3です。 Cannot invoke newStrutsKadai.EntryWorkForm.setArrayDB on bean class 'class newStrutsKadai.EntryWorkForm' - argument type mismatch - had objects of type "java.lang.String" but expected signature "java.util.ArrayList" と言うエラーがでます。 以下javaのソースです。DB接続は完璧に出来ています。 public final class EntryWorkForm extends ActionForm { private static final long serialVersionUID = 1L; private String cmbOsName; ArrayList<EntryWorkForm> array = new ArrayList<EntryWorkForm>( ) ; public void reset( ActionMapping map, HttpServletRequest req ) { //必要な部分だけ抜粋 //検索された行数文ループ while( rs.next( ) ) {//本マスタテーブル 検索された行数文ループ String stOSName = rs.getString("OSName"); //上記の2行を丁寧に記述した EntryWorkForm obj = new EntryWorkForm( stOSName.toString() ); array.add( obj ) ; } //END while( rs.next( ) ) this.setArrayDB( array );//ここでエラーエラーエラー } /****************************************************************************************/ private ArrayList<EntryWorkForm> arrayDB = new ArrayList<EntryWorkForm>( ); //セット オブジェクト配列 public void setArrayDB( ArrayList<EntryWorkForm> arrayDB ){ this.arrayDB = arrayDB; } //ゲット オブジェクト配列 public ArrayList<EntryWorkForm> getArrayDB ( ) { return this.arrayDB ; } /****************************************************************************************/ public String getCmbOSName ( ) { return this.cmbOsName; } public void setCmbOSName ( String cmbOsName ) { this.cmbOsName = cmbOsName; } public EntryWorkForm( ) { } //コンストラクタ 引数あり EntryWorkForm ( String cmbOSName ) { System.out.println("テスト用で作成したコンストラクタが呼ばれています。 ReturnScreenFormDB.java"); cmbOsName = cmbOSName; } 質問です--- JSPでセレクトボックスに動的に出力しています。 JSP画面でボタンを押して画面遷移をすると上記のエラーが出ます。

    • ベストアンサー
    • Java
  • 続き webアプリをつくってます。変数がなぜか渡りません。

    続き webアプリをつくってます。変数がなぜか渡りません。 見回ったのですが原因がわかりませんでした。 間違った箇所はどこですか。 package info.searchman; import java.io.*; import java.sql.*; //import java.util.*; public class ShinzinInfoTorokuBeans implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String Id; private String name; private String old; private String taiju; private String shintyo; private String other; //Constructor public ShinzinInfoTorokuBeans() { System.out.println("sitb constructor"); } // Setter Methods public void setId(String Id) { this.Id = Id; } public void setName(String name) { this.name = name; } public void setOld(String old) { this.old = old; } public void setTaiju(String taiju) { this.taiju = taiju; } public void setShintyo(String shintyo) { this.shintyo = shintyo; } public void setOther(String other) { this.other = other; } // Getting Methods public String getId() { return this.Id; } public String getName() { return this.name; } public String getOld() { return this.old; } public String getTaiju() { return this.taiju; } public String getShintyo() { return this.shintyo; } public String getOther() { return this.other; } //execute insert public void insert() { try { System.out.println("++++" +Id); System.out.println("tib7 insert"); //JDBC Driver Class.forName("org.postgresql.Driver"); Connection con = DriverManager.getConnection("jdbc:postgresql:postgres","postgres","gokui"); Statement stmt = con.createStatement(); String table = "testweb"; String values = "(\'"+Id+"\', \'"+name+"\', \'" +old+"\', \'"+taiju+"\', \'"+shintyo+"\', \'"+other+"\')"; //System.out.println("Id"+"name"+"old"+"taiju"+"shintyo+other"); String insertsql = "insert into "+table+" values " + values; //sql stmt.executeUpdate(insertsql); //db close stmt.close(); con.close(); } catch (Exception ex) { System.out.println("Exception insertでエラー: " + ex.getMessage()); } } } ここまで

    • ベストアンサー
    • Java
  • 【struts】 ActionFormで別のActionFormの配列を定義時

    皆様お疲れ様です。 現在strutsのコーディングをしているのですが躓いている箇所がございましてお力をお借りしたいと思い、質問させていただきます。 ActionForm_Aの中にActionForm_Bの配列型を宣言しています。 //その他変数色々あってその下 private ActionForm_B[] af_b; getter/setterとしては public ActionForm_B[] getActionForm_B() { return af_b; } public void setActionForm_B(final ActionForm_B[] setAfb) { this.af_b = setAfb; } です。jspで表示するのは出来ますが、取得する際に 「javax.servlet.ServletException:BeanUtils.populate」 が表示されてActionForm_Bの配列型が取得出来ません。 indexedもやっていますし、IterateのindexIdも指定しています。 <logic:iterate id ="af_b" name="af_a" property="af_b" scope="request" indexId="index"> <html:hidden name="af_b" property="name1" indexed="true"/> <html:hidden name="af_b" property="name2" indexed="true"/> </logic:iterate> 表示されているhidden部のhtmlは <input type="hidden" name="af_b[0].name1" value="鬼瓦権座武朗"> となっています。 これを表示している画面からsubmitしますと javax.servlet.ServletException: BeanUtils.populate と表示され落ちてしまいます。 これらの情報からなにか気付いた事、ご指摘等がありましたら是非ご意見を頂きたいと思います。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ユーザ管理システムについて・・・

    現在、登録したユーザアカウントのIDとパスワードを利用してログイン出来るシステムを作成しようとしています。 おそらく「JSP」と「ControllerServlet.java」部分は問題ないと思うのですが「ModelBean.java」に何か問題はあるのでしょうか? <ModelBean.java>は // パッケージの宣言 package myPackage; import java.sql.*; public class ModelBean implements java.io.Serializable{ // privateなプロパティの宣言 private String id; private String pass; private String name; private String aflg; private String process; private String processMessage; private Connection con; private Statement stmt; private String url = "jdbc:mysql://localhost/shopping_db?useUnicode=true&characterEncoding=Shift_JIS"; private String user = "root"; private String password = "123"; private String query = ""; // JavaBeansのコンストラクタの宣言 public ModelBean(){id=""; pass=""; name=""; aflg=""; process="0";} // IDを取得する処理 public String getId(){ return id; } // パスワードを取得する処理 public String getPass(){ return pass; } //名前を取得する処理 public String getName(){ return name; } //アクセス権限を取得する処理 public String getAflg(){ return aflg; } // 処理内容を取得する処理 public String getProcess(){ if (process.equals("2")){ processMessage = "データを登録しました";} else if(process.equals("3")){ processMessage = "下記データを更新しました";} else if(process.equals("4")){ processMessage = "下記データを削除しました";} else if(process.equals("1")){ processMessage = "ユーザーの一覧を表示しました";} else { processMessage = "データ表示画面";}//初期画面 System.out.println("process="+process); System.out.println("processMessage="+processMessage); return processMessage; } public void setProcess(String getProcess){ this.process = getProcess; } // DB接続処理 private void jdbcOpen(){ try{ // JDBCドライバをロードする Class.forName("org.gjt.mm.mysql.Driver"); // DB接続(ODBCデータソースの指定) System.out.println("url="+url); System.out.println("user="+user); System.out.println("password="+password); con = DriverManager.getConnection(url,user,password); stmt = con.createStatement(); } catch (Exception ex) { ex.printStackTrace ();} } // DBクローズ処理 private void jdbcClose(){ try{ stmt.close(); con.close(); } catch (Exception ex) { ex.printStackTrace ();} } // データ読み取り処理 public void selectDatas(String getId) { this.id=getId; jdbcOpen(); try{ // SQL文生成 query = "SELECT * FROM loginuser WHERE id="+id; System.out.println("select query"+query); // 実行 ResultSet rs = stmt.executeQuery(query); // 結果取得 rs.next(); id = rs.getString("id"); pass = rs.getString("pass"); name = rs.getString("name"); aflg = rs.getString("aflg"); rs.close(); } catch (Exception ex) { ex.printStackTrace ();} jdbcClose(); } //新規データ追加処理 public void addDatas(String getId, String getPass, String getName, String getAflg){ this.id=getId; this.pass=getPass; this.name=getName; this.aflg=getAflg; jdbcOpen(); try{ //------------------- // 登録処理 //------------------- // SQL文生成(登録) query = "INSERT INTO loginuser (id, pass, name, aflg) VALUES("+id+", '"+pass+"', '"+name+"', '"+aflg+"') "; // 実行 int flgUpdated = stmt.executeUpdate(query); } catch (Exception ex) { ex.printStackTrace ();} jdbcClose(); } 登録実行部分のプログラムのどこを変えたら動くようになるでしょうか?よろしくお願いします。

  • パッケージ内でコンパイルできない

    パッケージを作成して,以下のようなディレクトリ構成にしました. . ├── Sample.java └── vehicle   ├── MiniCar.java   ├── SuperCar.java   └── Vehicle.java vehicleディレクトリ内で $ javac SuperCar.java このようにコンパイルしました.ですが, SuperCar.java:3: シンボルを見つけられません。 シンボル: クラス Vehicle public class SuperCar extends Vehicle { ^ エラー 1 個 このようなエラーが出力されました. 同じディレクトリにあれば,ファイルを見つけに行ってくれると思いましたが, なぜコンパイルできないのでしょうか? #ちなみに,階層を1つ登って #$javac Sample.java #これはコンパイルできて,実行もできました. -- Sample.java -- import vehicle.*; public class Sample {    public static void main(String[] args) {      MiniCar mini = new MiniCar(2);      SuperCar scar = new SuperCar("Red");    } } -- MiniCar.java -- package vehicle; public class MiniCar extends Vehicle {   int num;   public MiniCar(int num) {      super(5,10);      this.num = num;   } } -- SuperCar.java -- package vehicle; public class SuperCar extends Vehicle {   String color;   public SuperCar(String color) {      super(10, 20);      this.color = color;   } } -- Vehicle.java -- package vehicle; public class Vehicle {   private int wheel;   private int wheelDiameter;   public Vehicle(int wheel, int wheelDiameter) {      this.wheel = wheel;      this.wheelDiameter = wheelDiameter;   } }

    • ベストアンサー
    • Java
  • Java Struts ~に対するゲッターメソッドがありません

    Java Struts WindowsXp Java Struts共に初心者です。 上記を使用してログイン画面を作成しています。 エラーが発生しているのですが 「Bean LoginFrm のプロパティ id に対するゲッターメソッドがありません」 と言われます。 参考サイトはいくつもあるのですが、そもそもイテレータを使用していないとか私の状況に一致する回答を見つけることができませんでした。 (JAVA、Struts共に慣れていないためか応用がきかないみたいです) loginTop.jsp login.jsp LoginFrm.java LoginAct.java struts-config.xml のいずれかが原因だとは思うのですが、そのどこかが皆目見当もつきません。 loginTop.jsp----------------------------- <html:form action="/login"> <table border="0"> <tr><td> ログインID<html:text name="LoginFrm" property="id" size="6" maxlength="5" /> </td></tr> <tr><td> パスワード<html:password name="LoginFrm" property="pass" size="6" maxlength="5" /> </td></tr> </table> </html:form> login.jsp---------------------- <html:form action="/login"> <table border="0"> <tr><td> A:<bean:write name="LoginFrm" property="id" /> </td></tr> <tr><td> B:<bean:write name="LoginFrm" property="pass" /> </td></tr> </table> </html:form> LoginFrm.java---------------------- private String id; private String pass; public String getID() { return id; } public void setID(String id) { this.id = id; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } LoginAct.java-------------------- throws Exception { request.setCharacterEncoding("Windows-31J"); LoginFrm logFrm = (LoginFrm) form; log.info(" user = "+logFrm.getID()); log.info(" user = "+logFrm.getPass()); return mapping.findForward("login"); } struts-config.xml--------------------------- <form-beans> <form-bean name="LoginFrm" type="loginForm.LoginFrm" /> </form-beans> ~ <action attribute="LoginFrm" input="/pages/loginTop.jsp" name="LoginFrm" path="/login" type="loginAction.LoginAct" scope="request" validate="true"> <forward name="login" path="/pages/login.jsp" /> </action> 以上です。 かなり長くなり申し訳ありません。

    • ベストアンサー
    • Java
  • アプレットが開始しないエラーについて

    今Javaで「1」のキーを押すと、現在表示されている画像が変わるアプレットを作っています。 書いたプログラムは以下です。 import java.applet.*; import java.awt.*; import java.awt.event.*; import java.lang.String; class Gazou extends Applet { private Image pic[] = new Image[3]; private int stat,stat2; private char pushkey; public Gazou(String name1, String name2, String name3, char c1) { this.stat=0; this.pic[0] = getImage(getDocumentBase(),name1); this.pic[1] = getImage(getDocumentBase(),name2); this.pic[2] = getImage(getDocumentBase(),name3); this.pushkey = c1; } public Image GetPicture(char n) { if(pushkey == n) { if(this.stat == 0) this.stat = 1; this.stat2=0; if(this.stat == 1) this.stat = 2; this.stat2=1; if(this.stat == 2) this.stat = -1; this.stat2=2; } return this.pic[this.stat2]; } } public class ImageView extends Applet implements KeyListener { char flg; Gazou data = new Gazou("1-1.JPG","1-2.JPG","a.JPG",'1'); public void init() { addKeyListener(this); } public void paint(Graphics g) { if(flg == '1') g.drawImage(data.GetPicture(flg),0,0,this); } public void keyPressed(KeyEvent e) { flg = e.getKeyChar(); repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } 1-1.JPG,1-2.JPG,a.JPGはソースファイルと同じディレクトリに保存してあります。 NullPointerExceptionが出てるので代入ミスなのかと思っているのですが、どこを直したらよいかわかりません。 どなたか分かる方ご教授おねがいします。 エラーメッセージは別に示します。

    • ベストアンサー
    • Java
  • private voidなメソッドはstatic コンテキストですか

    コンパイルエラーで、 「static コンテキストから参照することはできません」 と表示されます。 ソースにstaticという文字は有りません。 private voidなメソッドはstatic コンテキストですか? [Foo.java] import com.nttdocomo.ui.*; public class Foo extends IApplication {  public void start() {   Display.setCurrent(new MyPanel());  } } class MyPanel extends Panel {  private void e() {   Bar.DShow(Dialog.DIALOG_ERROR, "", "");  } } [Bar.java] import com.nttdocomo.ui.*; public class Bar {  public void DShow(int type, String title, String body) {   Dialog d = new Dialog(type, title);   d.setText(body);   d.show();  } }

    • ベストアンサー
    • Java
  • javaの同期について

    javaの同期について package rwlock; public class App1 extends Thread { static private final int REFER = 0; static private final int UPDATE = 1; static private final int[] conf1 = { REFER, REFER, REFER, UPDATE }; static private final int[] conf2 = { REFER, UPDATE, REFER, REFER }; static private MyObj0 mo = new MyObj0(); // App1 + MyObj0 int id; private int[] conf; public App1(int id, int[] conf) { this.id = id; this.conf = conf; } public void run() { long tStart = Time.current(); for (int i = 0; i < conf.length; i++) { switch(conf[i]) { case REFER: mo.refer(); break; case UPDATE: mo.update(); break; default: assert false : "internal error"; } } if (id == 1) { Time.printElapsed(tStart); } } public static void main(String[] args) { App1 th1 = new App1(1, conf1); App1 th2 = new App1(2, conf2); th1.start(); th2.start(); } } public class MyObj0 { private Object countLock = new Object(); private int count; private void enter() { synchronized(countLock) { count++; } } private void leave() { synchronized(countLock) { count--; } } public MyObj0() { count = 0; } public void refer() { enter(); Time.sleep(300); leave(); } public void update() { enter(); synchronized(countLock) { assert count == 1; } Time.sleep(500); leave(); } において、updateの実行中は、他のスレッドでもupdateもreferも実行されないが、二つのスレッドで同時にreferは実行されうるという条件を満たすにはどうしたらよいでしょうか?updateにsynchronizedをつけてみましたが、referが同時に実行されてしまいました。

    • ベストアンサー
    • Java