IllegalAnnotationException в тесте JUnit - PullRequest
0 голосов
/ 05 октября 2018

Я хочу создать тест JUnit для тестирования кода JAXB:

@XmlRootElement(name = "reconcile")
public class Reconcile {

    @XmlElement(name = "start_date")
    @XmlJavaTypeAdapter(LocalDateTimeXmlAdapter.class)
    public LocalDateTime start_date;
    @XmlElement(name = "end_date")
    @XmlJavaTypeAdapter(LocalDateTimeXmlAdapter.class)
    public LocalDateTime end_date;
    @XmlElement(name = "page")
    public String page;

    //// getters and setters
}

Я пробовал этот тест JUnit для приведенного выше кода:

import java.time.LocalDateTime;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.datalis.plugin.reconcile.Reconcile;
import org.junit.jupiter.api.Test;

public class ReconciliationTest {

    @Test
    public void uniqueTransactionIdLenght() throws JAXBException {

        Reconcile reconcile = new Reconcile();
        reconcile.start_date = LocalDateTime.of(2018, 4, 8, 11, 2, 44);
        reconcile.end_date = LocalDateTime.of(2018, 11, 8, 11, 2, 44);
        reconcile.page = "1";

        JAXBContext jaxbContext = JAXBContext.newInstance(Reconcile.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(reconcile, System.out);
    }
}

Но когда я запускаю код, я получаю:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 3 counts of IllegalAnnotationExceptions
    at org.datalis.plugin.jaxb.ReconciliationTest.uniqueTransactionIdLenght(ReconciliationTest.java:22)

в этой строке

JAXBContext jaxbContext = JAXBContext.newInstance(Reconcile.class);

Есть ли способ решить проблему?

1 Ответ

0 голосов
/ 05 октября 2018

Глядя на сообщение об ошибке, которое вы упоминаете в комментариях:

У класса есть два свойства с одинаковым именем "end_date", эта проблема связана со следующим расположением: в публичном java.time.LocalDateTime

Проблема, вероятно, заключается в следующем:

У вас либо нет аннотации @XmlAccessorType (так что используется тип доступа по умолчанию), либо у вас есть, но с неправильнойтип доступа.

Попробуйте добавить эту аннотацию к своему классу:

@XmlAccessorType(XmlAccessType.FIELD)

Объяснение:

JAXB может обрабатывать ваши классы по-разному.Он может либо просматривать пары получатель / установщик, либо он может просматривать поля напрямую.Это тип доступа.

Тип доступа по умолчанию - XmlAccessType.PUBLIC_MEMBER, что немного странно: он будет рассматривать как открытые пары геттер / установщик, так и открытые поля.

Если вы поставитеаннотации, такие как @XmlElement для полей, но у вас также есть методы getter / setter для этих полей, тогда JAXB найдет getter / setter и также найдет поле, потому что оно аннотировано явно, а затем будет думать, что есть два свойствас тем же именем: одно определено getter / setter, а другое определено полем.

Решение состоит в том, чтобы сообщить JAXB, что он должен смотреть только на поля, используя XmlAccessType.FIELD или@XmlElement аннотации для метода получения или установки вместо поля.

Это немного странно, но вот как работает JAXB ...

Обратите внимание, что вы можете поставить @XmlAccessorType(XmlAccessType.FIELD) не только в классе, но и во всем пакете, помещая его в файл package-info.java - таким образом, вам не нужно помещать его в каждый из классов вашей доменной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...