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 に設定されます。

「トースト」を真として解析する理由を誰か教えてもらえますか? ちなみに、そこに入力した文字列は関係ありません。常に true として解析されます...

煩わしい歴史的な理由から、jaxb 1.0 を使用しています。

4

1 に答える 1

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

無効な値の検出

で を指定するValidationEventHandlerUnmarshaller、変換の問題を検出できます。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 に答える