Camel Rest DSL响应编码

Zac*_*ach 2 java rest json apache-camel jackson

我目前正在使用新的Camel REST DSL作为基础,开发基于REST的Java应用程序.它主要工作,除了我注意到通过REST客户端(而不是说浏览器)调用URL时,JSON响应是"乱码",并且我认为是错误的编码


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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

完整的工作版本可以在这里找到:https: //github.com/zwhitten/camel-rest-test

在Chrome中访问网址{host}/testApp/data时,响应如下:

{
data: "Sherlock",
value: "Holmes",
count: 10
}
Run Code Online (Sandbox Code Playgroud)

但是,使用Postman浏览器插件作为客户端返回:

"W3siZGF0YSI6ImRhdGE6OjAiLCJ2YWx1ZSI6InZhbHVlOjowIiwiY291bnQiOjB9LHsiZGF0YSI6ImRhdGE6OjEiLCJ2YWx1ZSI6InZhbHVlOjoxIiwiY291bnQiOjF9LHsiZGF0YSI6ImRhdGE6OjIiLCJ2YWx1ZSI6InZhbHVlOjoyIiwiY291bnQiOjJ9LHsiZGF0YSI6ImRhdGE6OjMiLCJ2YWx1ZSI6InZhbHVlOjozIiwiY291bnQiOjN9LHsiZGF0YSI6ImRhdGE6OjQiLCJ2YWx1ZSI6InZhbHVlOjo0IiwiY291bnQiOjR9LHsiZGF0YSI6ImRhdGE6OjUiLCJ2YWx1ZSI6InZhbHVlOjo1IiwiY291bnQiOjV9LHsiZGF0YSI6ImRhdGE6OjYiLCJ2YWx1ZSI6InZhbHVlOjo2IiwiY291bnQiOjZ9LHsiZGF0YSI6ImRhdGE6OjciLCJ2YWx1ZSI6InZhbHVlOjo3IiwiY291bnQiOjd9LHsiZGF0YSI6ImRhdGE6OjgiLCJ2YWx1ZSI6InZhbHVlOjo4IiwiY291bnQiOjh9LHsiZGF0YSI6ImRhdGE6OjkiLCJ2YWx1ZSI6InZhbHVlOjo5IiwiY291bnQiOjl9XQ=="
Run Code Online (Sandbox Code Playgroud)

问题似乎是REST绑定模式为"auto"并使用自定义marshaller.如果我将绑定模式设置为"json",那么浏览器和客户端响应都会出现乱码.如果我将绑定模式设置为"json"并绕过自定义marshallers一切正常.有没有办法配置路由使用自定义编组器并正确编码响应,无论客户端?

lts*_*las 8

我认为解决方案是使用默认绑定选项(关闭),因为您使用自定义封送器.