2

我有一个定义为布尔值的 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

4

1 回答 1

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

检测无效值

如果您在 上指定 a 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
于 2013-05-31T09:38:58.853 回答