使用.getClass()时如何将参数传递给构造函数?

时间:2011-11-15 09:17:09

标签: java reflection jackson spring-remoting

我有那行代码,它正在使用该版本:

...
Wrapper<Model> wrapped = restTemplate.getForObject(BASE_URL, Wrapper.class, map);
...

但是我想将参数发送给构造函数:

...
Wrapper<Model> wrapped = restTemplate.getForObject(BASE_URL, new Wrapper(Model.class).getClass(), map);
...

它引发了一个例外:

org.springframework.web.client.ResourceAccessException: I/O error: No suitable constructor found for type [simple type, class a.b.c.d.model.Wrapper]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: org.apache.commons.httpclient.AutoCloseInputStream@ef9e8eb; line: 1, column: 3]; nested exception is org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class a.b.c.d.model.Wrapper]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: org.apache.commons.httpclient.AutoCloseInputStream@ef9e8eb; line: 1, column: 3]

如何将参数发送到我将获得它的值类的对象?

2 个答案:

答案 0 :(得分:1)

Wrapper.classnew Wrapper().getClass()以及new Wrapper(theParam).getClass()返回相同的值:Wrapper.class。如果您有可变构造函数,即能够获得参数theParam的构造函数,则所有这些。在你的情况下,类Wrapper没有接受类型为Class的参数的构造函数,所以它会抱怨这个。

答案 1 :(得分:0)

我认为你需要的是指出Jackson使用的通用类型的Wrapper。有几种方法可以做到这一点:

Wrapper<Model> value = objectMapper.readValue(source, new TypeReference<Wrapper<Model>>() { });
Wrapper<Model> value = objectMapper.readValue(source, objectMapper.getTypeFactory().constructParametricType(Wrapper.class, Model.class);

我不确定TypeReference或JavaType(通过Spring框架传递类实例(通过类型擦除,即没有泛型!)是泛型启用的替代方法),但我认为它应该是可能的。

或者,如果无法使其工作,请尝试对Wrapper进行子类化 - 具体的子类WILL实际上有必要的信息:

public class ModelWrapper扩展Wrapper {}    ModelWrapper wrapped = restTemplate.getForObject(BASE_URL,ModelWrapper.class);