2012-03-08 11 views
13

Dostaję następujący błąd, gdy próbuje utworzyć wystąpienie „Transacao”Xstream no-args błąd konstruktora

`Error: Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor ` 

---- Debugging information ---- 

message : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor 

cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException 

cause-message : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor ` 

class : br.com.cbmp.ecommerce.resposta.Transacao 

required-type : br.com.cbmp.ecommerce.resposta.Transacao 

path : /transacao 

Zdaję sobie sprawę, że jest to błąd z XStream 1.3.1 i JDK7, ale Obecnie używam XStream 1.3.1 i JDK6. Jakieś pomysły, dlaczego ten błąd nadal występuje?

Dzięki

+1

Czy twoja klasa ma konstruktor inny niż arg? Jeśli nie napiszesz konstruktora, użyje on konstruktora no-arg z 'Object', ale jeśli napiszesz konstruktor, to nie musisz podawać własnego konstruktora no-arg. – twain249

+0

@ twain249 klasa rzeczywiście ma konstruktor z argumentami, co prowadzi mnie do pytania: czy naprawdę muszę utworzyć konstruktor no-arg? Muszę przekazać parametry, bo inaczej klasa nie zadziała.Jeśli dodasz konstruktor no-arg, wywoła ten konstruktor, a obiekt będzie niekompletny, w wyniku czego NullPointerException –

+1

Jakiś czas temu miałem podobny problem z Dynamic Web Project, który chciał mi zdefiniować konstruktor no-args i raz zrobiłem wszystko wydawało się działać. Nie wiem dokładnie, dlaczego było to wymagane (zakładam, że gdy usługa REST próbowała utworzyć odpowiedź bez danych, do której została wywołana domyślnie), ale o ile mogę powiedzieć, że dodanie go nie wpłynęło na wydajność mojego kodu. Wszystko, co zrobiłem w konstruktorze, to "super()" – twain249

Odpowiedz

5

Prosta odpowiedź: wszystkich swoich wewnętrznych klas muszą być oznakowane statyczne, czy należy użyć pełnej np nie klasy wewnętrzne.

Długa odpowiedź: Java wykonuje kilka czynności automatycznie, a użytkownik napotkał przypadek krawędzi (patrz here). Jest (w większości) niemożliwe, aby klasa wewnętrzna miała konstruktor no-args. Java zawsze dodaje jeden argument do dowolnego konstruktora w klasie wewnętrznej/lokalnej, a ten argument jest odwołaniem do klasy nadrzędnej. To jest używane, abyś mógł uzyskać dostęp do wszystkich zmiennych/metod rodzica, ale oznacza, że ​​nawet konstruktor no-args (w kodzie) ma (podczas używania odbicia, jak xstream) jeden argument. Aby to naprawić, oznacz klasę jako statyczną, aby nie wymagała ona już dziedziczenia wszystkich metod/zmiennych klasy nadrzędnej.

+1

+1 Dziękuję za długą odpowiedź, dobrze wiedzieć, dlaczego tak się dzieje, a nie tylko jak je rozwiązać. Rozwiązał również mój problem. – RyanfaeScotland

+1

Zaktualizowałem do XStream 1.4.4, ponieważ JRL powiedział, że nie działa, ale to działało dla mnie, dziękuję @Hamy – praveenb

17

3 rozwiązania:

  1. zapewnić konstruktor (oczywisty) no-args
  2. Dodać obiektu realizacji Serializable.
  3. Upgrade do Xstream 1.4.4 *

używam Rozwiązanie 2 cały czas.

* I zweryfikowane 1.2.2 nie działa i 1.4.4 nie działa, nie próbowałem żadnych wersje w międzyczasie

+0

Używam XStream 1.4.4 z JDK6 i mam podobny problem. Nie mogę użyć rozwiązania 1 lub 2. Jakieś inne pomysły? – cadavre

2

xstream 1.3.1 nie obsługuje już ten deserializacji pod JDK 1.7, jeśli nie ma non-Arg konstruktor.

Rozdzielczość:

1) Aby rozwiązać ten problem, należy użyć JDK6 jeśli chcesz kontynuować 1.3.1 słoika.

2) Jeśli używasz JDK7 lub nowszego rozwiązania, aby rozwiązać ten problem, musisz zaktualizować JAR xstream.jar 1.3.1 do późniejszego wydania.

Więcej szczegółów można znaleźć pod numerem https://jira.atlassian.com/browse/JRA-32823.

Powiązane problemy