2012-10-11 17 views
2

我的实体类:Struts2的REST插件:传递数组中的JSON

import java.util.ArrayList; 


public class Test { 
    private String name; 
    private String description; 
    private ArrayList<String> countries; 

    public Test() { 

    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public ArrayList<String> getCountries() { 
     return countries; 
    } 

    public void setCountries(ArrayList<String> countries) { 
     this.countries = countries; 
    } 
} 

的JSON我想送:

{"countries": ["CA", "SG"], "description":"whee", "name": "foo"} 

错误:

2345447 [http-bio-8080-exec-1] ERROR freemarker.runtime - Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: Error while setting property=countries type interface java.util.List 

Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: Error while setting property=countries type interface java.util.List 
The problematic instruction: 
---------- 
==> ${msgs[0][0]} [on line 76, column 25 in org/apache/struts2/dispatcher/error.ftl] 
---------- 

Java backtrace for programmers: 
---------- 
freemarker.template.TemplateModelException: Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: Error while setting property=countries type interface java.util.List 
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130) 
    at freemarker.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138) 
    at freemarker.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111) 
    at freemarker.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90) 
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89) 
    at freemarker.core.Expression.getStringValue(Expression.java:93) 
    at freemarker.core.DollarVariable.accept(DollarVariable.java:76) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IfBlock.accept(IfBlock.java:82) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IfBlock.accept(IfBlock.java:82) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.Environment.process(Environment.java:190) 
    at freemarker.template.Template.process(Template.java:237) 
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:797) 
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:519) 
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.lang.NullPointerException 
    at freemarker.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:85) 
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106) 
    ... 37 more 

设定“名称“和”描述“而不尝试传入”国家/地区“工作 - 值已成功映射。

使用下面的XML工作过:

<com.foo.bar.entity.Test> 
<countries> 
<string>SG</string> 
</countries> 
<description>testt</description> 
</com.foo.bar.entity.Test> 

UPDATE:

如果我改变清单的String []它的工作原理。我可以忍受这一点,但是有谁知道是否有可能向Struts/rest-plugin/json-plugin指出我会更喜欢List而不是数组?

回答

0

尽量做到当JSON解析器发送List<>对象本

private List<String> countries; 

也许错误发生,你的VAR的类型为ArrayList<>

我们没有什么现在的实例类型,解析器会设置,所以总是使用接口,而不是实现。

+0

嗨,感谢您的帮助,但它仍然无法正常工作。完全相同的错误...在我更改为私人列表国家后; – shaunlim