Problem demarshalling Map
davidka Dec 21, 2012 8:25 AMHello everyone!
I have a resolver class which inlcudes a map with translations:
@Portable
public class TranslationResolver {
public TranslationResolver(){}
private Map<String, Map<String, String>> translations;
public Map<String, Map<String, String>> getTranslations() {
return translations;
}
public void setTranslations(Map<String, Map<String, String>> translations) {
this.translations = translations;
}
}
and a service which has methods to return the resolver or the map from the resolver:
@Service
public class RPCDemoService implements TranslationRemoteService {
@Override
public TranslationResolver getResolver() {
TranslationResolver transResolver = new TranslationResolver();
Map<String, Map<String, String>> allTranslations = getTranslations();
transResolver.setTranslations(allTranslations);
return transResolver;
}
@Override
public Map<String, Map<String, String>> getTranslations() {
//create map for german translations
Map<String, String> deTranslations = new HashMap<String, String>();
deTranslations.put("hello", "Hallo");
deTranslations.put("one", "Eins");
//create map for english translations
Map<String, String> enTranslations = new HashMap<String, String>();
enTranslations.put("hello", "Hello");
enTranslations.put("one", "One");
//put the translations together
Map<String, Map<String, String>> allTranslations = new HashMap<String, Map<String,String>>();
allTranslations.put("de", deTranslations);
allTranslations.put("en", enTranslations);
return allTranslations;
}
}
When i call the getTranslations() method through a rpc proxy, i get the correct translations:
Translations: {de={hello=Hallo, one=Eins}, en={hello=Hello, one=One}}
But when i call the getResolver() method, the values of the inner map are null:
Translations: {de={hello=null, one=null}, en={hello=null, one=null}}
I found out, tha if I create a custom marshaller, copy content from generated marshaller (ServerMarshallingFactoryImpl.java) and delete the commented (setAssumedMapKeyType and setAssumedMapValueType) lines, it works:
...
public TranslationResolver demarshall(EJValue a0, MarshallingSession a1) {
try {
if (a0.isNull()) {
return null;
}
EJObject obj = a0.isObject();
String objId = obj.get("^ObjectID").isString().stringValue();
if (a1.hasObject(objId)) {
return a1.getObject(TranslationResolver.class, objId);
}
TranslationResolver entity = new TranslationResolver();
a1.recordObject(objId, entity);
if ((obj.containsKey("translations")) && (!obj.get("translations").isNull())) {
//a1.setAssumedMapKeyType("java.lang.String");
//a1.setAssumedMapValueType("java.util.Map");
entity.setTranslations((Map) java_util_Map.demarshall(obj.get("translations"), a1));
//a1.setAssumedMapKeyType(null);
//a1.setAssumedMapValueType(null);
}
return entity;
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException("error demarshalling entity: org.errai.samples.rpcdemo.client.shared.TranslationResolver", t);
}
}
...
I've attached a sample, which extends your RPC Demo and shows the problem
-
rpcdemo.zip 20.2 KB