属性 "empty" 未按预期使用 SimpleFramework
Attribute "empty" not working as expected with SimpleFramework
所以我试图在元素没有值时设置一个空属性。
所以我的 class 看起来像这样:
@Order(attributes = { "name" })
public class TypeNumber {
@Attribute(required = false)
protected String name;
@Element(required = false)
@Attribute(empty = "xsi:nil=\"true\"")
protected BigDecimal value;
//getter setter methods goes here
}
如果是空值,我期望输出:
<field name="some_name">
<value xsi:nil="true"/>
</field>
而实际输出是:
<field name="some_name"/>
知道为什么空属性没有按预期工作吗?
还是我做错了?
注意: 我正在使用 SimpleFramework XML 和 VisitorStrategy
。所以,不能使用AnnotationStrategy
。我也有自定义访问者来读取和写入节点。
您将需要一个自定义转换器...
现在你的输出是:
<typeNumber name="original" value="10"/>
和
<typeNumber name="original_empty" value="xsi:nil="true""/>
那么让我们开始吧!
您要做的第一件事是将 AnnotationStrategy 传递给 Persister 的构造函数:
Serializer serializer = new Persister(new AnnotationStrategy());
.. 然后在您的模型中创建一个自定义转换器:
@Root(name = "TypeNumberFixed")
@Order(attributes = {"name"})
@Convert(TypeNumberFixed.FixConverter.class)
class TypeNumberFixed {
@Attribute(required = false)
protected String name;
@Element(required = false, name = "value")
protected BigDecimal value;
public static class FixConverter implements Converter<TypeNumberFixed> {
@Override
public TypeNumberFixed read(InputNode inputNode) throws Exception {
//Implement your own deConverter
return null;
}
@Override
public void write(OutputNode node, TypeNumberFixed value) throws Exception {
node.setAttribute("name",value.name);
OutputNode valueNode = node.getChild("value");
if (value.value != null) {
valueNode.setValue(value.value.toPlainString());
} else {
valueNode.setAttribute("xsi:nil", "true");
}
}
}
}
这将分别为 empty/nonempty values 生成以下输出:
typeNumberFixed.value = null:
<TypeNumberFixed name="new_empty">
<value xsi:nil="true"/>
</TypeNumberFixed>
typeNumberFixed.value = 30:
<TypeNumberFixed name="new">
<value>30</value>
</TypeNumberFixed>
Here's 如果您有兴趣,请回购。
所以我试图在元素没有值时设置一个空属性。
所以我的 class 看起来像这样:
@Order(attributes = { "name" })
public class TypeNumber {
@Attribute(required = false)
protected String name;
@Element(required = false)
@Attribute(empty = "xsi:nil=\"true\"")
protected BigDecimal value;
//getter setter methods goes here
}
如果是空值,我期望输出:
<field name="some_name">
<value xsi:nil="true"/>
</field>
而实际输出是:
<field name="some_name"/>
知道为什么空属性没有按预期工作吗? 还是我做错了?
注意: 我正在使用 SimpleFramework XML 和 VisitorStrategy
。所以,不能使用AnnotationStrategy
。我也有自定义访问者来读取和写入节点。
您将需要一个自定义转换器...
现在你的输出是:
<typeNumber name="original" value="10"/>
和
<typeNumber name="original_empty" value="xsi:nil="true""/>
那么让我们开始吧!
您要做的第一件事是将 AnnotationStrategy 传递给 Persister 的构造函数:
Serializer serializer = new Persister(new AnnotationStrategy());
.. 然后在您的模型中创建一个自定义转换器:
@Root(name = "TypeNumberFixed")
@Order(attributes = {"name"})
@Convert(TypeNumberFixed.FixConverter.class)
class TypeNumberFixed {
@Attribute(required = false)
protected String name;
@Element(required = false, name = "value")
protected BigDecimal value;
public static class FixConverter implements Converter<TypeNumberFixed> {
@Override
public TypeNumberFixed read(InputNode inputNode) throws Exception {
//Implement your own deConverter
return null;
}
@Override
public void write(OutputNode node, TypeNumberFixed value) throws Exception {
node.setAttribute("name",value.name);
OutputNode valueNode = node.getChild("value");
if (value.value != null) {
valueNode.setValue(value.value.toPlainString());
} else {
valueNode.setAttribute("xsi:nil", "true");
}
}
}
}
这将分别为 empty/nonempty values 生成以下输出:
typeNumberFixed.value = null:
<TypeNumberFixed name="new_empty">
<value xsi:nil="true"/>
</TypeNumberFixed>
typeNumberFixed.value = 30:
<TypeNumberFixed name="new">
<value>30</value>
</TypeNumberFixed>
Here's 如果您有兴趣,请回购。