Digester 中有一个奇怪的行为,我无法理解。
我有以下代码在输入 xml 中遇到“角色/角色”节点时调用“角色”对象的构造函数:
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 是 2 而不是 1。当我调试代码时,似乎 Digester 试图创建 2 个额外的对象,并将“null”作为构造函数参数。
<roles>
<role name="m1" machine="mymachine" />
</roles>
如果我有代码检查构造函数的参数是否为空,这将导致各种问题。
我的角色类的定义是:
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++;
}
}