我有那行代码,它在那个版本下工作:
...
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]
我如何发送参数到一个对象,我将得到它的类的值?
Wrapper.class
和new Wrapper().getClass()
与new Wrapper(theParam).getClass()
返回相同的值:Wrapper.class
。所有这一切,如果你有合适的构造函数,即,构造函数能够获得参数theParam
。在您的例子中,类Wrapper
没有接受Class
类型参数的构造函数,因此它会报错。
我认为您需要的是指明Jackson要使用的包装器的一般类型。有两种方法可以做到这一点:
Wrapper<Model> value = objectMapper.readValue(source, new TypeReference<Wrapper<Model>>() { });
Wrapper<Model> value = objectMapper.readValue(source, objectMapper.getTypeFactory().constructParametricType(Wrapper.class, Model.class);
我不确定如何typerreference或JavaType(这是泛型支持的替代传递类实例(类型擦除,即没有泛型!))通过Spring框架,但我认为它应该是可能的。
或者,如果不能工作,尝试子类包装器——具体的子类实际上有必要的信息:
公共类ModelWrapper扩展Wrapper {}ModelWrapper包装= restTemplate。getForObject (BASE_URL ModelWrapper.class);