org.simpleframework.xml对象替换上的ValueRequiredException

问题描述

我正在尝试使用here中所述的Simple 2.7.1中的对象替换功能,但是无论我如何尝试都无法使其正常工作。不幸的是,本教程示例对我的技能水平有一定限制。

在下面的示例中,我希望我的TestContainer从testContainer.xml中反序列化,然后再将每个TestVictim从其自己的XML中反序列化,然后再将其添加到其集合中。如果我正确理解,对象替换应该允许我这样做。相反,我不断收到以下错误

Exception in thread "main" org.simpleframework.xml.core.ValuerequiredException: Unable to satisfy @org.simpleframework.xml.Attribute(name="",required=true,empty="") on field 'name' private java.io.File game.test.TestVictim.name for class game.test.TestVictim at line 4
    at org.simpleframework.xml.core.Composite.validate(Composite.java:644)
    at org.simpleframework.xml.core.Composite.readAttributes(Composite.java:416)
    at org.simpleframework.xml.core.Composite.access$300(Composite.java:59)
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1382)
    at org.simpleframework.xml.core.Composite.read(Composite.java:201)
    at org.simpleframework.xml.core.Composite.read(Composite.java:148)
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:190)
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:167)
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:144)
    at org.simpleframework.xml.core.Composite.readVariable(Composite.java:619)
    at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573)
    at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549)
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:532)
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445)
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59)
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383)
    at org.simpleframework.xml.core.Composite.read(Composite.java:201)
    at org.simpleframework.xml.core.Composite.read(Composite.java:148)
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
    at org.simpleframework.xml.core.Persister.read(Persister.java:625)
    at org.simpleframework.xml.core.Persister.read(Persister.java:606)
    at org.simpleframework.xml.core.Persister.read(Persister.java:584)
    at org.simpleframework.xml.core.Persister.read(Persister.java:543)
    at org.simpleframework.xml.core.Persister.read(Persister.java:521)
    at org.simpleframework.xml.core.Persister.read(Persister.java:426)
    at game.env.xml.XMLHandler.buildTestContainer(XMLHandler.java:72)
    at game.test.XMLTest.main(XMLTest.java:26)

设置@Attribute(required = false)只会导致其他异常。

在测试中,此代码TestVictim对象找到并读取了适当的XML,但是遇到了此异常,而不是执行替换。

@Root(name = "TestContainer")
public class TestContainer {

    @Element(name = "ContainerName")
    private String containerName = "";
    @ElementList(name = "Victim",inline = true)
    private Dictionary<TestVictim> testVictim = new Dictionary<>();

    public TestContainer() {
    }
}

...

@Root(name = "Victim")
public class TestVictim implements Entry {

    @Element(name = "TestProperty1")
    private String testProperty1 = "1";
    @Element(name = "TestProperty2")
    private String testProperty2 = "2";

    @Attribute
    private File name;

    public TestVictim() {
    }

    @Override
    public String getName() {
        return null;
    }

    @Resolve
    public TestVictim resolve() throws Exception {
        return new Persister().read(TestVictim.class,name);
    }
}

...

<?xml version="1.0" encoding="UTF-8"?>
<TestContainer>
    <ContainerName>Test Container</ContainerName>
    <Victim name = "resources/test/testvictim1.xml" class = "game.test.TestVictim"></Victim>
</TestContainer>

...

<?xml version="1.0" encoding="UTF-8"?>
<TestVictim>
    <TestProperty1>Property1</TestProperty1>
    <TestProperty2>Property2</TestProperty2>
</TestVictim>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)