Camel ProducerTemplate.getBody (Class<T>) Json для Pojo всегда возвращает нуль
У меня есть шаблон производителя, который вызывает конечную точку Http4. Как я могу преобразовать ответ в Pojo? Работает только конвертирование в String, но не конвертирование в Pojo с помощью providerTemplate.getBody(Class).
Map<String, Object> headers = new HashMap<>();
headers.put(Exchange.HTTP_METHOD, GET);
//This is working, I can see the response
String responseBody = producerTemplate.getBody(String.class);
//This not working working, always return null
Foo responseBody = producerTemplate.getBody(Foo.class);
Образец Фу Джсон:
{
"name":"juan",
"age": 12
}
Foo.java
public class Foo {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2 ответа
Существует эволюция верблюда 2.17 на конвертере Джексона с CAMEL-9583. С этим изменением вы сможете включить "запасной конвертер", используя Джексона, установив эти свойства в контексте:
context.getProperties().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true");
context.getProperties().put(JacksonConstants.TYPE_CONVERTER_TO_POJO, "true");
Верблюд затем попытается использовать Джексона, чтобы преобразовать сообщение в ваш класс pojo.
В текущей версии (2.16) вы можете создать явный конвертер для вашего pojo:
@Converter
public FooConverter {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Converter
public static Foo fromString(String message) {
return MAPPER.readValue(message, Foo.class);
}
}
Вы можете использовать Джексона так:
import org.codehaus.jackson.map.ObjectMapper;
// [...]
ObjectMapper json = new ObjectMapper();
Foo foo = json.readValue(producerTemplate.getBody(String.class), Foo.class);
Я не знаю, как внедрить формат данных json для отмены маршалинга непосредственно в шаблон производителя.
Конечно, вы можете использовать любую другую библиотеку JSON, если захотите.