2016-01-18 3 views
1

У меня есть XML-файл, как следующийJAXB маршализация одного примитивного элемента

<tag1> 
    <intag1> 
     <item> 
      <aaa>sdfdfsf</aaa> 
      <bbb>fvdfv</bbb> 
     </item> 
    </intag1> 
    <intag2>3</intag2> 
</tag1> 

Я использую пружинный пакет с JAXB для чтения XML и карты на объекты. У меня есть объектная модель для intag1, и она отображается без каких-либо проблем, но я хочу нанести intag2 на объект int напрямую. Вот пример кода, который я тестировал, но это дает мне следующее исключение. может ли кто-нибудь указать на проблему?

Jaxb2Marshaller jaxb2unmarshaller = new Jaxb2Marshaller(); 
jaxb2unmarshaller.setClassesToBeBound(int.class); 
jaxb2unmarshaller.afterPropertiesSet(); 

StaxEventItemReader reader = new StaxEventItemReader(); 

reader.setResource(new InputStreamResource(new FileInputStream("test6.xml"))); 
reader.setUnmarshaller(jaxb2unmarshaller); 
reader.setFragmentRootElementName("intag2"); 
reader.afterPropertiesSet(); 
reader.open(new ExecutionContext()); 

исключение:

[com.sun.istack.internal.SAXParseException2; lineNumber: 105; columnNumber: 25; unexpected element (uri:"", local:"intag2"). Expected elements are (none)] 

ответ

1

Это связано с отсутствием javax.xml.bind.annotation на классе int или java.lang.Integer.

EDIT (Удалено старое решение)

мне удалось отобразить только <intag2>, делая это:

Читатель:

<batch:reader> 
    <bean class="org.springframework.batch.item.xml.StaxEventItemReader"> 
     <property name="fragmentRootElementName" value="intag2" /> 
     <property name="resource" value="file:config/steps/test6.xml" /> 
     <property name="unmarshaller"> 
      <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
        <property name="classesToBeBound"> 
         <list> 
          <value>Intag2</value> 
         </list> 
        </property> 
      </bean> 
     </property> 
    </bean> 
</batch:reader> 

Mapping класс:

@XmlRootElement(name = "intag2") 
public class Intag2 { 

    private Integer intag2; 

    @XmlElement(name = "intag2") 
    public Integer getIntag2() { 
     return intag2; 
    } 

    public void setIntag2(Integer intag2) { 
     this.intag2 = intag2; 
    } 
} 

It выглядит как корневой элемент c а также простой элемент для чтения одновременно.

+0

У меня уже есть классы моделей для отображения 'intag1', а' intag1' можно повторять в 1000 раз, поэтому я использую потоковое вещание. Я не хочу сопоставлять элемент корневого уровня 'tag1' с объектом java, потому что это займет гораздо больше памяти. – Sudheera

+0

@Sudheera Я обновил свой ответ, чтобы он соответствовал вашим потребностям – Thrax

+0

Hi @Thrax Спасибо, я только что опубликовал другой ответ, просто сделайте быстрый взгляд. – Sudheera

1

Привет, ребята, я нашел способ сделать это и опубликовать здесь как ответ для других.

Нам необходимо создать класс модели с аннотациями RootElement следующим образом и должен дать тег @XmlValue, чтобы указать, что значение элемента должно отображаться в целочисленное поле. Вот и все

@XmlRootElement(name = "intag2") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class IV_TRAILER { 

    @XmlValue 
    private int value; 

    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 
} 
Смежные вопросы