防止在ElementListUnion中为空ElementList包含空标记

时间:2013-01-21 17:10:50

标签: java simple-framework

我的一个班级中有以下代码:

@Text(required=false)
@ElementListUnion({
    @ElementList(required = false, inline = true, type = com.company.Child.class, entry="values")
})
public List<Object> valueUnion;

请注意,这似乎是让框架使用包含子项和文本的元素的唯一方法。当文本存在且元素列表也包含元素时,这很有用,并产生以下xml:

<parent>
    <values>val 1</values>
    <values>val 2</values>
    some text
</parent>

但是,有时元素列表不包含元素,只有文本存在(意味着valueUnion List只包含一个元素,即文本字符串)。但是,这会产生以下XML:

<parent>
    <values />
    some text
</parent>

这就是问题所在,因为这会导致服务器阻塞空的<values />标记。不幸的是我无法控制服务器上的代码,我正在寻找一种方法来强制Simple忽略空标记,如果elementlist不包含任何元素。

1 个答案:

答案 0 :(得分:2)

我有一个解决方法。它不漂亮,但这个概念可以帮到你。
除了元素注释,您还可以使用自定义Converter来自定义对象。

  • Example上课:

(包含您需要的列表,文本和其他元素)

@Root(name="parent")
@Convert(ExampleConverter.class)
public class Example
{
    private String text; // Save the text you want to set ('some text' in your code)
    private List<Object> valueUnion;

    // Constructor + getter / setter
}

实际上,您只需要@Convert(ExampleConverter.class)@Root注释,因为序列化是在您自己的转换器中完成的(ExampleConverter)。

  • ExampleConverter上课:

(在此处序列化/反序列化您的对象)

public class ExampleConverter implements Converter
{
    @Override
    public Object read(InputNode node) throws Exception
    {
        /* TODO: Deserialize your class here (if required). */
        throw new UnsupportedOperationException("Not supported yet.");
    }


    @Override
    public void write(OutputNode node, Object value) throws Exception
    {
        final Example val = (Example) value;
        final List<Object> l = val.getValueUnion();

        if( !l.isEmpty() ) // if there are elements, insert their nodes
        {
            for( Object obj : l )
            {
                node.getChild("values").setValue(obj.toString());
            }
        }
        else
        {
            node.getChild("values").setValue(""); // this creates <values></values> if list is empty
        }
        node.setValue(val.getText()); // Set the text (1)
    } 
}

(1):即使有其他元素,也会设置文本。但是,这种解决方案可能会破坏您的格式文本和结束标记将在同一行。您可以通过插入新行来解决此问题。

  • 用法:

创建序列化器,您的策略和写/读

Serializer ser = new Persister(new AnnotationStrategy()); // 'AnnotationStrategy is important here!
ser.write(...); // write / read
  • 实施例

使用列表中的元素:

Example t = new Example();
t.setText("abc"); // Set the text
t.getValueUnion().add("value1"); // Add some elements to list
t.getValueUnion().add("value2");

Serializer ser = new Persister(new AnnotationStrategy());
ser.write(t, f); // 'f' is the file to write

输出:

<parent>
   <values>value1</values>
   <values>value2</values>abc</parent>

列表中没有元素:

Example t = new Example();
t.setText("abc"); // Set the text

Serializer ser = new Persister(new AnnotationStrategy());
ser.write(t, f); // 'f' is the file to write

输出:

<parent>
   <values></values>abc</parent>

如前所述,请注意形成“问题”!