jaxb将随机字符串绑定到xs:boolean'true'

时间:2013-05-31 08:25:47

标签: java xml jaxb xsd

我有一个定义为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

1 个答案:

答案 0 :(得分:2)

JAXB 2 (JSR-222)中,行为相反,无效的布尔值(true1以外的值)将设置为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