我有一个定义为boolean的xml元素,但是当我传入一个字符串'blablabla'时,它会被编组为true。
这是xsd:
<xs:complexType name="usageAttributesType">
<xs:sequence>
<xs:element name="force-reservation" type="xs:boolean" minOccurs="0" />
<xs:element name="force-purchase" type="xs:boolean" minOccurs="0" />
.............
请求xml看起来像这样:
<usage-auth-rate-charge>
<msisdn>444fh7775hweff</msisdn>
<service-id>c001</service-id>
<usage-attributes>
<force-purchase>toast</force-purchase>
在我的java中我有:
JAXBContext jc = JAXBContext.newInstance("com.mycompany.binding.request" );
jc.createUnmarshaller().unmarshal(xml);
绑定的jaxb对象将forcePurchase标志设置为true。如果我将其保留在xml请求之外,或将其设置为false,则该标志将设置为false(正确)。
有谁能告诉我为什么它解析'吐司'是真的?顺便说一句,我放在那里的字符串并不重要,它总是被解析为真......
出于烦人的历史原因,我们正在使用jaxb 1.0
答案 0 :(得分:2)
在JAXB 2 (JSR-222)中,行为相反,无效的布尔值(true
和1
以外的值)将设置为false
。
Java模型(Foo)
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Foo {
private boolean bar;
public boolean isBar() {
return bar;
}
public void setBar(boolean bar) {
this.bar = bar;
}
}
<强>演示强>
import java.io.StringReader;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StringReader xml = new StringReader("<foo><bar>toast</bar></foo>");
Foo foo = (Foo) unmarshaller.unmarshal(xml);
System.out.println(foo.isBar());
}
}
<强>输出强>
false
检测无效值
如果您在ValidationEventHandler
上指定Unmarshaller
,则可以检测到转化问题。遇到无效的布尔值时,默认ValidationEventHandler
会继续,JAXB 2中的值会设置为false。
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent ve) {
System.out.println(ve.getMessage());
return true;
}
});
现在输出如下:
String "toast" is not valid boolean value.
false