Java 迭代从put接收的参数ArrayList时获取ClassCastException
使用Restlet,我试图通过PUT方法接收Foo类的列表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 = "";
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();
// ...
}