我有那行代码,它正在使用该版本:
...
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]
如何将参数发送到我将获得它的值类的对象?
答案 0 :(得分:1)
Wrapper.class
和new 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);