Play-Framework: возникновение исключения IllegalArgumentException

Я получаю ошибку 'IllegalArgumentException occured' Can not set java.util.ArrayList field mi.types.ListOfObjects.objects to java.util.LinkedList

Я делаю следующее...

 ListOfObjects objects = li.getUsersObjects();

который обычно отлично работает, однако, когда я делаю тот же самый вызов с точно таким же кодом внутри Play, это не так. Я вызываю его в моем контроллере безопасности внутри функции authenticate(). Есть случай, когда объекты пользователей получены с внешнего сервера. Вот когда этот звонок сделан. Он отлично работает без Play, и я почти уверен, что он работал, прежде чем я поместил его в контроллер безопасности. Почему его размещение здесь может вызвать такую ​​проблему?

ИЗМЕНИТЬ

ListOfObjects — это настраиваемый объект, который содержит некоторые значения. Он расположен внутри li, библиотеки, которую я импортирую. Это выглядит примерно так...

public class ListOfObjects {

  private ArrayList<Object> objects;

  public ArrayList<Object> getObjects(){
          return objects;
   }
}

getUserObjects просто возвращает объекты для этого пользователя. Он захватывает их с сервера, а затем использует gson для их анализа. Однако я получаю указанную выше ошибку, когда пытаюсь это сделать.

ИЗМЕНИТЬ2

Независимо от того, что я делаю, мой тип для getUserObjects всегда возвращается как LinkedList, даже если это объект ArrayList. Я пытался позвонить getObjects() напрямую, и никаких изменений.

ИЗМЕНИТЬ 3

getUserObjects определяется как...

        Gson gson = new Gson();
    ListOfObjects objects = gson.fromJson(r.getBody(), ListOfObjects.class);

Трассировки стека...

где r.getBody() — это ответ сервера в формате JSON.

   Execution exception (In /app/controllers/Security.java around line 57)
 IllegalArgumentException occured : Can not set java.util.ArrayList field     lm.types.ListOfObjects.objects to java.util.LinkedList

play.exceptions.JavaExecutionException: Can not set java.util.ArrayList field lm.types.ListOfObjects.objects to java.util.LinkedList
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:227)
at Invocation.HTTP Request(Play!)
 Caused by: java.lang.IllegalArgumentException: Can not set java.util.ArrayList field lm.types.ListOfObjects.objects to java.util.LinkedList
at com.google.gson.FieldAttributes.set(FieldAttributes.java:188)
at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler(JsonObjectDeserializationVisitor.java:118)
at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.java:158)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:131)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)
at com.google.gson.Gson.fromJson(Gson.java:406)
at lm.lib.LMethods.getUsersObjects(LMethods.java:165)
at controllers.Security.createNewUser(Security.java:57)
at controllers.Security.authenticate(Security.java:36)
at play.utils.Java.invokeStaticOrParent(Java.java:159)
at controllers.Secure$Security.invoke(Secure.java:193)
at controllers.Secure$Security.access$0(Secure.java:184)
at controllers.Secure.authenticate(Secure.java:64)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:540)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:498)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:474)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:469)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:157)
... 1 more

Отладчику не удалось подключиться: ошибка recv во время рукопожатия: сброс соединения узлом


person Skizit    schedule 02.11.2011    source источник
comment
Можете ли вы опубликовать больше кода? Что такое ListOfObject, li, getUsersObjects()?   -  person axtavt    schedule 02.11.2011
comment
@axtavt Я обновил свой вопрос, добавив код/объяснение.   -  person Skizit    schedule 02.11.2011
comment
Как определяется getUsersObjects()? Мне нужно увидеть полную трассировку стека, а не только сообщение об ошибке   -  person mbknor    schedule 02.11.2011
comment
@mbknor Я добавил и трассировку стека, и дополнительную информацию о getUsersObjects()   -  person Skizit    schedule 02.11.2011


Ответы (1)


В сообщении об исключении четко говорится, что Gson десериализует список как LinkedList, тогда как поле вашего ListOfObjects объявляется как ArrayList.

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

public class ListOfObjects {
    private List<Object> objects; 
    ...
}
person axtavt    schedule 02.11.2011