Nano Hash - криптовалюты, майнинг, программирование

JAXB Unmarshal Список интерфейсов

Я пытаюсь обернуть 2 класса, построенные по шаблону Composite, с помощью JAXB.

Все это я построил так:

public interface ICriterion {String somemethod(String arg);}

@XmlRootElement(name = "criterion")
@XmlAccessorType(XmlAccessType.FIELD)
public class Criterion implements ICriterion {
    @XmlElement String name;
    @XmlElement String data;
    //getter, setter, somemethod(), Criterion(), Criterion(String, String)
}

@XmlRootElement(name = "criteria")
@XmlAccessorType(XmlAccessType.FIELD)
public class Criteria implements ICriterion {
    @XmlAnyElement(lax=true)
    private final List<ICriterion> criteria;
    //getter, setter, somemethod(), 
    Criteria(){criteria = new ArrayList<>();}
    Criteria(List<ICriterion>)...
}

я взял это решение из этого ответа

Он отлично работает для сортировки - я могу предоставить критерии, которые содержат список критериев и критериев, он правильно маршалируется в xml.

Однако не работает преобразование строки в объект

String request = 
<criteria>
    <criteria>
        <criterion>
            <name>number1</value>
            <data>123123</token>
        </criterion>
        <criterion>
            <name>number2</value>
            <data>1223323</token>
        </criterion>
    </criteria>
    <criterion>
        <name>number3</value>
        <data>1212</token>
    </criterion>
</criteria>


JAXBContext ctx = JAXBContext.newInstance(Criteria.class, Criterion.class);
    StringReader reader = new StringReader(request);
    Criteria wrapped = (Criteria) ctx.createUnmarshaller().unmarshal(reader);

дает:

java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)

Я пробовал другие способы, доступные через онлайн-источники, такие как:

@XmlElementRefs({ @XmlElementRef(type=Criterion.class), @XmlElementRef(type=Criteria.class)})

@XmlElements({@XmlElement(type=Criteria.class),@XmlElement(type=Criterion.class)})

которые не выдают ошибку, но приводят к тому, что список становится пустым. Решение этой проблемы заключается в использовании @XmlAnyElement(lax=true), который мне не подходит.

Мое первое предположение заключалось в том, что список каким-то образом неправильно инициализирован в моем конструкторе, а JAXB использует какой-то список фиксированного размера. Моя контрмера заключалась в том, чтобы явно инициализировать список в конструкторе без аргументов.

Criteria(){criteria = new ArrayList<>();}

Проблема также не решается путем явного указания "critera" на ArrayList<> вместо List<>.

Что мне не хватает?

07.01.2016

  • Вы пытались использовать @XmlElementWrapper()? 07.01.2016
  • это дало бы мне дополнительный тег ‹criteria›, обертывающий список, чего я не хочу - я попробую, если это решит проблему 07.01.2016
  • это не решает проблему, просто добавьте теги упаковки в маршалинг 07.01.2016
  • billdoor, Вы решили этот вопрос? 23.07.2018

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..