Java 迭代从put接收的参数ArrayList时获取ClassCastException

Java 迭代从put接收的参数ArrayList时获取ClassCastException,java,restlet,Java,Restlet,使用Restlet,我试图通过PUT方法接收Foo类的列表 class Foo { public String name; public int age; } public class Bar extends ServerResource { @Put public String update(ArrayList<Foo> foos) { String names = "";

使用Restlet,我试图通过PUT方法接收Foo类的列表

    class Foo {
        public String name;
        public int age;
    }

 public class Bar extends ServerResource  {   
    @Put
    public String update(ArrayList<Foo> foos) { 
        String names = "";        
        try {
            for (Foo foo : foos ) {
                names += ","+foo.name;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return names;
    }
}
我在for循环的第一行得到这个异常

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to Foo
    at Bar.update(Bar.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.restlet.resource.ServerResource.doHandle(ServerResource.java:503)
    at org.restlet.resource.ServerResource.put(ServerResource.java:1275)
    at org.restlet.resource.ServerResource.doHandle(ServerResource.java:583)
    at org.restlet.resource.ServerResource.doNegotiatedHandle(ServerResource.java:649)
    at org.restlet.resource.ServerResource.doConditionalHandle(ServerResource.java:348)
    at org.restlet.resource.ServerResource.handle(ServerResource.java:952)
    at org.restlet.resource.Finder.handle(Finder.java:246)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Router.doHandle(Router.java:431)
    at org.restlet.routing.Router.handle(Router.java:648)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:155)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
    at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:84)
    at org.restlet.Application.handle(Application.java:381)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Router.doHandle(Router.java:431)
    at org.restlet.routing.Router.handle(Router.java:648)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.routing.Router.doHandle(Router.java:431)
    at org.restlet.routing.Router.handle(Router.java:648)
    at org.restlet.routing.Filter.doHandle(Filter.java:159)
    at org.restlet.routing.Filter.handle(Filter.java:206)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
    at org.restlet.Component.handle(Component.java:392)
    at org.restlet.Server.handle(Server.java:516)
    at org.restlet.engine.ServerHelper.handle(ServerHelper.java:72)
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:152)
    at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1089)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:744)

知道如何遍历列表并获取Foo项属性吗

@XmlRootElement
注释您的
Foo
。否则,JSON序列化程序不知道要取消序列化到哪个类。

已解决-希望找到更直接的解决方案,但这是我迄今为止找到的解决方案

 @Put
    @Trace(dispatcher = true)
    public String update(String args) {
        try {

            Gson gson = new Gson();
            TypeToken<List<Foo>> token = new TypeToken<List<Foo>>() {
            };
            List<Foo> fooz = gson.fromJson(args, token.getType());
            String names = "";
            for (Foo foo : fooz) {
                //do something foo.name;
            }

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

        return "Success";
    }
@Put
@跟踪(dispatcher=true)
公共字符串更新(字符串参数){
试一试{
Gson Gson=新的Gson();
TypeToken token=新的TypeToken(){
};
List fooz=gson.fromJson(args,token.getType());
字符串名称=”;
for(Foo-Foo:fooz){
//做点什么,foo.name;
}
}捕获(例外e){
e、 printStackTrace();
}
返回“成功”;
}

根据我之前对答案的评论,这里有一个更合适的答案:


使用Restlet转换器,您需要使用
JsonRepresentation
对象,并告诉资源使用JSON:

@Put("json")
public String update(JsonRepresentation foos) {
    JSONArray fooArray = foos.getJsonArray();
    // ...
}

你能发布你调用方法的方式吗?我怀疑您传递给方法的参数不包含fooot,它使用以下标题Accept,content type,值为“application/json”。我正在使用HTTP客户端进行尝试。带有PUT的简单http调用method@thobens-我的道歉也请确保使用@Consumes(“application/json”)注释
update()
,我不确定这是否解决了问题,但您是否尝试使用
列表而不是
ArrayList
作为
update()的参数
然后让框架选择实现?您认为解决方案如何?还有更直接的方法吗?如果这个解决方法适合你的需要,那就足够了。我不会高兴的。您(在Gson之前)使用了什么来序列化/取消序列化JSON数据?Restlet converterThanks,但是org.Restlet.ext.JSON.JSON表示不接受类型参数,我把它与Jackson混淆了。顺便问一下,您是否考虑过使用Jackson进行JSON序列化?另一个选择是JAXB。。。(当然,还有很多,但我一直在RESTful API中使用JAXB,它工作起来很有魅力)谢谢,但它是一个更大项目的一部分,我已经删除了答案中的类型参数。遗憾的是,Restlet转换器不支持泛型,但无论如何它都应该可以工作。
@Put("json")
public String update(JsonRepresentation foos) {
    JSONArray fooArray = foos.getJsonArray();
    // ...
}