我已经解决了这个问题,但最终无法弄清楚错误的痕迹 - 这可能是一些微妙的事我可能做错了。
我正在为GSON实施一个解决方法,它具有真正的problems parsing nested maps。
public class RegisterValues
{
int Earth;
int Mars;
//etc for 200 planets
public Map returnValues()throws IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException{
final String [] fieldValues = new String[] {"Earth", "Mars", //etc }
RegisterValues regValues = new RegisterValues();
Map values = new HashMap<String, Integer>();
//values.put("Earth", Earth); manually this works, I'd rather loop through a readymade array of String values.
for (String value : fieldValues){
values.put(field, regValues.getClass().getField(field).getInt(field);) //here it breaks
}
return values;
}
}
错误跟踪:
Rebinding example.client.Panel // This is the class that is calling the above function
02:24:31.704 [DEBUG] Checking rule <generate-with class='com.google.gwtjsonrpc.rebind.RemoteJsonServiceProxyGenerator'/>
02:24:31.704 [ERROR] Errors in '.../RegisterValues.java'
02:24:31.704 [ERROR] Line 324: No source code is available for type java.lang.SecurityException; did you forget to inherit a required module?
02:24:31.704 [ERROR] Line 333: The method getField(String) is undefined for the type Class<capture#1-of ? extends RegisterValues>
所有行号都是指我称之为此类的部分。它在我手动填充地图时起作用,但是当我尝试使用这种循环方法时它不起作用。
基本上我想知道上述内容是否正确?
Sidenote :如果以上看起来是正确的,是否由于这是不可能的,因为这是一个反映的类,即它是即时编译的(GWT.create( ))只有当我访问程序的这一部分时 - 因此它有一些问题吗?
答案 0 :(得分:2)
java.lang.SecurityException
被抛到客户端,但它与GWT客户端不兼容(因为客户端代码被交叉编译为Javascript)。
有关可与客户端代码一起使用的Java类列表,请参阅此链接: http://www.gwtproject.org/doc/latest/RefJreEmulation.html
您好像在客户端调用getField(String)
。这就是[ERROR] Line 333
发生的原因。如果此代码位于服务器端,请确保此类的路径在.gwt.xml
中没有作为源路径的条目(例如:确保<source path='server' />
没有存在)。
您可以尝试regValues.getClass()
而不是RegisterValues.class
吗? (我不确定这是否会产生影响)
此外,我不确定您要完成的任务,但您无法在GWT客户端使用Gson。您可以改为使用GWT的AutoBean功能:using Gson library in GWT client code
您可以在服务器端使用Gson,如果它没有创建Map
,您可以在客户端使用,您可以编写自定义序列化程序(com.google.gson.JsonSerializer
)和解串器(com.google.gson.JsonDeserializer
)构建可在客户端使用的Map
。