Как передать параметр в конструктор при использовании .getClass ()? - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть эта строка кода, и она работала в этой версии:

...
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 ]

1 голос
/ 15 ноября 2011

Wrapper.class и new Wrapper().getClass() и new Wrapper(theParam).getClass() возвращают одно и то же значение: Wrapper.class.Все это, если у вас есть подходящий конструктор, т.е. конструктор, который может получить аргумент theParam.В вашем случае класс Wrapper не имеет конструктора, который принимает аргумент типа Class, поэтому он жалуется на это.

0 голосов
/ 15 ноября 2011

Полагаю, вам нужно указать общий тип Обертки для использования Джексоном. Есть несколько способов сделать это:

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 (которые являются альтернативами с поддержкой универсальных элементов для передачи экземпляров Class (которые стираются с помощью типов, то есть нет универсальных элементов!)) Через среду Spring, но я предполагаю, что это должно быть возможно. *

В качестве альтернативы, если это не сработает, попробуйте подкласс Wrapper - конкретный подкласс БУДЕТ фактически иметь необходимую информацию:

открытый класс ModelWrapper расширяет Wrapper {} ModelWrapper wrapped = restTemplate.getForObject (BASE_URL, ModelWrapper.class);

...