JAXB関連のエラー
エラーその1
Java Swingでの開発中に表題の様なエラーが出ました。
javax.swing.SingleSelectionModelはインタフェースです。JAXBはインタフェースを処理できません。
実装内容としては、次のようになっています。
- XMLファイルを読み込み
- 対応するデータをクラスで保持する⇔XMLファイルに出力
このエラーは、
実装部分としては下のようなコードです。
<処理部分>
public class InputSelector extends JPopupMenu {
・・・
private void openCommandMenu(SelectMenu item) {
List<Command> cmdList = play.getJob().getCommandList();
for (Command cmd : cmdList) {
cmd.addActionListener(this);
add(cmd);
addSeparator();
}
}
・・・
}
add()しているCommandクラスをJMenuItemで拡張しています。※拡張したらエラーになりました。
JMenuItemを継承したのでエラーになりました。
なので、このクラスを保持するクラスを作成して、エラーを直しました。
@Data
public class Command extends JMenuItem implements ConfigIF {
private String id;
private String name;
private Formula formula;
public Command() {
}
public Command(String id, String name, Formula formula) {
this.id = id;
this.name = name;
this.formula = formula;
}
}
新たに作成したクラス
<CommandMenu>
import javax.swing.*;
public class CommandMenu extends JMenuItem {
private Command command;
public CommandMenu() {
}
public CommandMenu(Command cmd) {
super(cmd.getName());
this.command = cmd;
}
public Command getCommand() { return command; }
public void setCommand(Command cmd) { this.command = cmd; }
}
余談1
JAXBでXMLからクラスを生成するとき、対象のクラスには、デフォルトコンストラクタが定義されていないとエラーになる。
<XMLの一部抜粋>
<config>
<views>HP</views>
<views>MP</views>
<views>LV</views>
<money>
<key>NIG</key>
<name>ニギ</name>
<value>0</value>
</money>
<money>
<key>GLD</key>
<name>ゴールド</name>
<value>1</value>
</money>
<element>
<id>FIR</id>
<name>火</name>
</element>
<element>
<id>WIN</id>
<name>風</name>
</element>
<element>
<id>WAT</id>
<name>水</name>
</element>
<element>
<id>EAT</id>
<name>土</name>
</element>
</config>
<クラス>
package jp.zenryoku.rpg.data.config;
import lombok.Data;
/**
* このゲームで使用する要素・エレメントを定義する。
*
* @author (Takunoji)
* @version (1.0)
*/
@Data
public class Element
{
/** ID */
private String id;
/** 要素名 */
private String name;
/** デフォルトコンストラクタ */
public Element() {
}
public Element(String id, String name) {
this.id = id;
this.name = name;
}
}
エラーその2
下の様なエラーが出ました。
javax.xml.bind.DataBindingException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
プロパティmoneyが存在しますが、@XmlType.propOrderに指定されていません
XML出力の順番を指定する「\@XmlType(propOrder=XXX)」の指定の中にフィールド変数の「money」が登録されていなかった。
下のコードは追加した後です。
対象のクラス
@XmlRootElement( name="player")
@XmlType(propOrder={"level", "name", "sex", "status", "items", "job", "state", "wepon", "armor", "money"})
@Data
public class Player implements Cloneable
{
private static final boolean isDebug = true;
/** 名前 */
protected String name;
/** レベル */
protected int level;
/** 性別 */
protected SEX sex;
/** ステータス */
protected Map<String, Params> status;
/** 所持アイテム */
protected List<Item> items;
/** 職業 */
protected Job job;
/** 状態 */
protected State state;
/** 武器 */
protected Wepon wepon;
/** 防具 */
protected Armor armor;
/** お金 */
protected int money;
...
}
エラーその3
javax.xml.bind.DataBindingException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
プロパティmoneyが@XmlType.propOrderにありますが、そのようなプロパティは存在しません。noの誤りである可能性があります。
対象のクラス
もともとholdmneyの部分がmoneyになっていた。
propOrderの中身を正しく書き換えたら治った。
@Data
@XmlRootElement( name="monster")
@XmlType(propOrder={"no", "talk", "message", "type", "holdmoney", "exp"})
public class Monster extends Player implements Cloneable, Serializable
{
/** 番号 */
private int no;
/** 話す */
private boolean talk;
/** 話すときのメッセージ */
private String message;
/** モンスタータイプ */
private MonsterType type;
/** お金 */
private int holdmoney;
/** 経験値 */
private int exp;
...
}