2013-05-31 6 views
2

У меня есть элемент xml, определенный как boolean, но когда я передаю строку 'blablabla', он получает сопоставленное значение true.jaxb привязка случайной строки к xs: boolean '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

ответ

2

В JAXB 2 (JSR-222) поведение является противоположностью, недействительным булево значения (значения, отличные от true и 1), будут установлены в false.

Java Model (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; 
    } 

} 

Demo

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 
+0

Благодаря Блез для быстрого реагирования. Единственное, чего не было в вашем ответе, было то, что мне пришлось включить проверку для unmarshaller следующим образом: 'unmarshaller.setValidating (true);' – mdarwin

+0

Фактически я обнаружил, что в jaxb 1.0 обработчик проверки по умолчанию обрабатывает этот случай правильно, поэтому мне не нужно перегружать его, но мне нужно включить проверку. – mdarwin

Смежные вопросы