Play-Framework:导致发生'IllegalArgumentException

时间:2011-11-02 10:45:45

标签: java playframework

我得到的错误是'IllegalArgumentException occured' Can not set java.util.ArrayList field mi.types.ListOfObjects.objects to java.util.LinkedList

我正在做以下事情......

 ListOfObjects objects = li.getUsersObjects();

通常可以正常工作,但是当我使用与Play内部完全相同的代码执行完全相同的调用时,它不会。我在authenticate()函数内的安全控制器中调用它。有一种情况是用户对象是从外部服务器获取的。这就是这个电话的时候。它没有播放就可以正常工作,而且在我把它放入安全控制器之前我确定工作。为什么要把它放在这里导致这样的问题?

修改

ListOfObjects是一个包含一些值的自定义对象..它位于li内,这是我正在导入的库。它看起来像这样......

public class ListOfObjects {

  private ArrayList<Object> objects;

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

getUserObjects只返回该用户的对象。它从服务器抓取它们,然后使用gson来解析它们。但是,当我尝试时,我收到了上述错误。

EDIT2

无论我做什么,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失败:通过对等方重置连接

1 个答案:

答案 0 :(得分:3)

异常消息清楚地表明Gson将列表反序列化为LinkedList,而ListOfObjects的字段则声明为ArrayList

避免此类问题的一般规则是不在字段声明中使用实现类。请改用List

public class ListOfObjects {
    private List<Object> objects; 
    ...
}