2013-08-14 7 views
2

Мой код работал нормально. Я изменил некоторые вещи, и теперь у меня есть несколько списков целых чисел, которые уже не разборчивы. Чтобы попытаться избавиться от этой проблемы, я полностью переварил все, и проблема все еще сохраняется.Неверный код для целого числа

Я сократил свой файл XML вниз в тестовый файл, для которого все содержимое является

<polylist> 
    <p>1 0 0 0 0 1 2 0 2 3 1 3 1 1 4 2 1 5</p> 
</polylist> 

Я сократил мой Java-код до тестового файла, для которого все содержимое является

import java.io.File; 
import java.util.List; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "polylist") 
public class PolyList 
{ 
    public List<Integer> p; 

    public static void main(String[] args) throws Exception 
    { 
     JAXBContext jaxbContext = JAXBContext.newInstance(PolyList.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     PolyList pl = (PolyList)unmarshaller.unmarshal(new File("ptest.xml")); 
     System.out.println(pl.p); 
    } 
} 

Печать pl.p приводит к выходу [1291596391], который не является ожидаемым [1 0 0 0 0 1 2 ...]. Если я изменю public List<Integer> p; на public List<String> p;, тогда он правильно выведет [1 0 0 0 0 1 2 0 2 3 1 3 1 1 4 2 1 5], как и ожидалось. Так что он правильно приобретает List<String>, но не List<Integer>. Он работал нормально, правильно получив List<Integer> несколько дней назад в полном производственном проекте, но больше не работает.

На самом деле, версия List<String> НЕ работает. Между номерами нет запятых, а это означает, что он не отображает список из нескольких строк, каждая строка представляет собой другое число. Скорее всего, это 1 строка, представляющая все это.

Благодарим вас, Блейз, за ​​то, что указали это. Моя ошибка за то, что не заметила это раньше.

ответ

3

Вы должны использовать аннотацию @XmlList на поле p.

@XmlList 
public List<Integer> p; 

UPDATE

Следующая правда, я бы исследовать дальше, почему.

javax.xml.bind.DatatypeConverter.parseInt("1 0 0 0 0 1 2 0 2 3 1 3 1 1 4 2 1 5") == 1291596391 

Если изменить общественный список р; к публичному списку p; то он правильно выводит [1 0 0 0 0 1 2 0 2 3 1 3 1 1 4 2 1 5] как и ожидалось.

Если вы измените его на List<String> вы получите List с один вход в который 1 0 0 0 0 1 2 0 2 3 1 3 1 1 4 2 1 5. С аннотацией @XmlList вы получите вывод [1, 0, 0, 0, 0, 1, 2, 0, 2, 3, 1, 3, 1, 1, 4, 2, 1, 5], указав, что это List со многими товарами.

+0

Почему это иногда работает без XmlList, но иногда оно не работает и требует его? Или, может быть, лучший вопрос: если он работает без аннотации XmlList, это технически неправильное поведение, на которое я не должен рассчитывать и поэтому всегда включать аннотацию в этой ситуации? – Loduwijk

+0

@Loduwijk - Я не могу представить, как это иногда срабатывает. Только два способа преобразования элементов, разделенных пробелами, в «Список» - либо использовать '@ XmlList', либо' @ XmlValue' в свойстве «Список». –

+1

О, ох! Я даже не понял, что версия String не содержит запятых, что действительно означает, что это тоже список с 1 элементом. Виноват. Тем не менее, поскольку он работал раньше, в соответствии с тем, что вы говорите, он должен иметь аннотацию XmlList, если он работает правильно. Я просто предполагаю, что у меня был XmlList и удалил его в какое-то время в недавнем прошлом.Я не знаю, почему я сделал бы это, и я не помню, чтобы это делал, но я просто предполагаю, что должен. – Loduwijk

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