JAXB Unmarshalling NPE

Odpowiedz Nowy wątek
2020-01-03 14:56

Rejestracja: 1 miesiąc temu

Ostatnio: 2 dni temu

0

Cześć koledzy i koleżanki. Mam problem z NPE podczas unmarshallingu dokumentu XML.

Klasa modelu:

public class DogModel {

    private  StringProperty name;
    private  StringProperty sex;
    private  StringProperty breed;
    private  StringProperty coat;
    private  StringProperty rabiesVaccinations;
    private  StringProperty otherVaccinations;
    private  StringProperty litters;
    private  StringProperty surgicalProcedures;
    private  StringProperty heats;
    private  StringProperty birthday;

    public DogModel(){

        this.name = new SimpleStringProperty(null);
        this.sex = new SimpleStringProperty(null);

        this.breed = new SimpleStringProperty(null);
        this.coat = new SimpleStringProperty(null);
        this.rabiesVaccinations = new SimpleStringProperty(null);
        this.litters = new SimpleStringProperty(null);
        this.surgicalProcedures = new SimpleStringProperty(null);
        this.heats = new SimpleStringProperty(null);
        this.birthday = new SimpleStringProperty(null);
        this.otherVaccinations = new SimpleStringProperty(null);
    }
  • wygenerowane automatycznie przez IntelliJ gettery i settery

Klasa Wrappera:

@XmlRootElement(name = "dogs")
@XmlAccessorType(XmlAccessType.FIELD)
public class DogCollectionWrapper {

    private List<DogModel> dogs;
    public List<DogModel> getDogs(){
//        if(dogs == null){
//            dogs = new ArrayList<DogModel>();
//        }
        return dogs;
    }
    public void setDogs(List<DogModel> dogs){
        this.dogs = dogs;
    }

Metoda obsługująca odczyt z pliku (Zapis działa bez zarzutu):

try {
            JAXBContext context = JAXBContext.newInstance(DogCollectionWrapper.class);

            Unmarshaller unmarshaller = context.createUnmarshaller();

            DogCollectionWrapper wrapper = (DogCollectionWrapper) unmarshaller.unmarshal(file);

            dogModelObservableList.clear();
            dogModelObservableList.addAll(wrapper.getDogs());

            retrieveRabiesVaccinationDates();
            retrieveOtherVaccinationDates();

            StringUtil stringUtil = new StringUtil();

            contentForAlert = stringUtil.alertBuilder(overdueRabiesVaccinationsSet, monthBeforeRabiesVaccinationExpireDateSet, overdueOtherVaccinationsSet,
                    monthBeforeOtherVaccinationExpireDateSet);

            if(!contentForAlert.isEmpty()){
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle("Informacje");
                alert.setHeaderText(null);
                alert.setContentText(contentForAlert);

                alert.showAndWait();
            }

        }catch (JAXBException e){
            e.printStackTrace();
        }
    }

Wszystko działało ok do momentu, kiedy implementowałem wrzucanie apki do systemowego traya zamiast zamknięcia, i dodawałem auto zapis na podstawie listenera observable listy. Próbowałem już prawie wszystkiego, co znalazłem na stacku i w innych czeluściach sieci, nic nie działa tak jakbym tego oczekiwał. Jedyne czego jeszcze nie robiłem to zmiany wersji JAXB.

Będę wdzięczny jak ktoś zechce rzucić bardziej doświadczonym okiem ;)

edytowany 2x, ostatnio: Shalom, 2020-01-03 15:13

Pozostało 580 znaków

2020-01-06 13:12

Rejestracja: 8 lat temu

Ostatnio: 36 minut temu

0

Z tego wynika że brakuje tego co zakomentowane: https://www.ojit.com/article/883909


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2020-01-06 19:39

Rejestracja: 1 miesiąc temu

Ostatnio: 2 dni temu

0

Jeśli kawałek kodu odpowiadający za przypisanie nowego obiektu ArrayList do zmiennej dogs zostanie odkomentowany, to faktycznie nie rzuca NPE, aczkolwiek nie dostaję wtedy tego co jest w pliku, tylko po prostu pustą listę. Więc tak źle, i tak nie dobrze...

Pozostało 580 znaków

2020-01-07 07:18

Rejestracja: 3 lata temu

Ostatnio: 11 godzin temu

2

Twój root element to dogs, w którym masz pole dogs. To z tego co pamiętam powinno skutkować poniższym schematem xml'a:

<dogs>
   <dogs/>
   <dogs/>
   <dogs/>
   ...
</dogs>

Przypuszczam, że nie do końca jest to prawda i masz błąd w obiektowej reprezentacji xml'a

edytowany 1x, ostatnio: Tyvrel, 2020-01-07 07:18

Pozostało 580 znaków

2020-01-07 18:22

Rejestracja: 1 miesiąc temu

Ostatnio: 2 dni temu

0

Masz rację, root element do dogs, i element tez jest dogs, jednakże w niczym to nie wadzi. Kod został bez zmian, usunąłem folder .idea, i zaimportowałem ponownie cały projekt i wszystko działa jak powinno. Dzięki ;)

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0