В настоящее время я работаю над Java-приложением, основанным на REST, с использованием нового Camel REST DSL в качестве основы. Это в основном работает за исключением того, что я заметил при вызове URL-адресов с помощью клиента REST (вместо сказать, браузер) ответ JSON «разбитым» и приходит через с тем, что я предполагаю, что это неправильная кодировкаКодировка ответа DSL Camel Rest
MyRouteBuilder .java
@Component
public class MyRouteBuilder extends RouteBuilder{
@Autowired
LocalEnvironmentBean environmentBean;
@Override
public void configure() throws Exception {
restConfiguration().component("jetty").host("0.0.0.0").port(80)
.bindingMode(RestBindingMode.auto);
rest("/testApp")
.get("/data").route()
.to("bean:daoService?method=getData")
.setProperty("viewClass", constant(CustomeJsonViews.class))
.marshal("customDataFormat").endRest()
.get("/allData").route()
.to("bean:daoService?method=getDatas")
.setProperty("viewClass", constant(CustomeJsonViews.class))
.marshal("customDataFormat").endRest();
}
}
CustomeDataFormat.java
public class CustomDataFormat implements DataFormat{
private ObjectMapper jacksonMapper;
public CustomDataFormat(){
jacksonMapper = new ObjectMapper();
}
@Override
public void marshal(Exchange exchange, Object obj, OutputStream stream) throws Exception {
Class view = (Class) exchange.getProperty("viewClass");
if (view != null)
{
ObjectWriter w = jacksonMapper.writerWithView(view);
w.writeValue(stream, obj);
}
else
stream.write(jacksonMapper.writeValueAsBytes(obj));
}
@Override
public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
return null;
}
}
Полный рабочий вариант можно найти здесь: https://github.com/zwhitten/camel-rest-test
При переходе к URL {хост}/TestApp/данные, в Chrome, например, ответ приходит через как:
{
data: "Sherlock",
value: "Holmes",
count: 10
}
Однако с помощью плагина Почтальон браузера, как клиент возвращает:
"W3siZGF0YSI6ImRhdGE6OjAiLCJ2YWx1ZSI6InZhbHVlOjowIiwiY291bnQiOjB9LHsiZGF0YSI6ImRhdGE6OjEiLCJ2YWx1ZSI6InZhbHVlOjoxIiwiY291bnQiOjF9LHsiZGF0YSI6ImRhdGE6OjIiLCJ2YWx1ZSI6InZhbHVlOjoyIiwiY291bnQiOjJ9LHsiZGF0YSI6ImRhdGE6OjMiLCJ2YWx1ZSI6InZhbHVlOjozIiwiY291bnQiOjN9LHsiZGF0YSI6ImRhdGE6OjQiLCJ2YWx1ZSI6InZhbHVlOjo0IiwiY291bnQiOjR9LHsiZGF0YSI6ImRhdGE6OjUiLCJ2YWx1ZSI6InZhbHVlOjo1IiwiY291bnQiOjV9LHsiZGF0YSI6ImRhdGE6OjYiLCJ2YWx1ZSI6InZhbHVlOjo2IiwiY291bnQiOjZ9LHsiZGF0YSI6ImRhdGE6OjciLCJ2YWx1ZSI6InZhbHVlOjo3IiwiY291bnQiOjd9LHsiZGF0YSI6ImRhdGE6OjgiLCJ2YWx1ZSI6InZhbHVlOjo4IiwiY291bnQiOjh9LHsiZGF0YSI6ImRhdGE6OjkiLCJ2YWx1ZSI6InZhbHVlOjo5IiwiY291bnQiOjl9XQ=="
Проблема заключается в том, что режим привязки REST является «авто» и использует пользовательский маршаллер. Если я установил режим привязки на «json», то оба ответа браузера и клиента будут искажены. Если я установил режим привязки на «json» и обход пользовательских маршаллеров, все будет работать правильно. Есть ли способ настроить маршрут для использования настраиваемого маршаллера и правильно кодировать ответы независимо от клиента?