Digester には、理解できない奇妙な動作があります。
入力xmlで「roles/role」ノードに遭遇するたびに「Role」オブジェクトのコンストラクターを呼び出す次のコードがあります。
AbstractRulesModule loader = (new AbstractRulesModule() {
protected void configure() {
forPattern("roles/role").createObject().ofType(Role.class)
.usingConstructor(String.class, String.class).then()
.callParam().fromAttribute("machine").ofIndex(0);
forPattern("roles/role").callParam().fromAttribute("name")
.ofIndex(1);
forPattern("roles/role").setNext("add");
}
});
Digester digester = DigesterLoader.newLoader(loader).newDigester();
List<Role> roles = new ArrayList<>();
digester.push(roles);
digester.parse(new File("c:/RoleMapping.xml"));
System.out.println(roles);
System.out.println(Role.count);
Role のコンストラクターが呼び出されるたびに、Role.count がインクリメントされます。奇妙なことに、次の xml に対して上記のコードを実行した後、Role.count は 1 ではなく 2 です。コードをデバッグすると、Digester がコンストラクター パラメーターとして "null" を使用して 2 つの余分なオブジェクトを作成しようとしたようです。
<roles>
<role name="m1" machine="mymachine" />
</roles>
コンストラクターの引数が null であるかどうかをチェックするコードがある場合、これはあらゆる種類の問題につながります。
私の Role クラスの定義は次のとおりです。
public class Role {
private String machine;
private String name;
static int count = 0;
public Role(String machine, String name) {
this.machine = machine;
this.name = name;
count++;
}
}