首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骆驼静止DSL响应编码

骆驼静止DSL响应编码
EN

Stack Overflow用户
提问于 2014-12-04 19:00:06
回答 5查看 6.1K关注 0票数 3

我目前正在开发一个基于REST的java应用程序,使用新的Camel REST DSL作为基础。除了我注意到通过REST客户机(而不是浏览器)调用URL时,JSON响应是“乱七八糟的”,我认为是错误的编码。

MyRouteBuilder.java

代码语言:javascript
复制
@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

代码语言:javascript
复制
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

以Chrome为例,当转到URL {host}/testApp/data时,响应如下:

代码语言:javascript
复制
{
data: "Sherlock",
value: "Holmes",
count: 10
}

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

代码语言:javascript
复制
"W3siZGF0YSI6ImRhdGE6OjAiLCJ2YWx1ZSI6InZhbHVlOjowIiwiY291bnQiOjB9LHsiZGF0YSI6ImRhdGE6OjEiLCJ2YWx1ZSI6InZhbHVlOjoxIiwiY291bnQiOjF9LHsiZGF0YSI6ImRhdGE6OjIiLCJ2YWx1ZSI6InZhbHVlOjoyIiwiY291bnQiOjJ9LHsiZGF0YSI6ImRhdGE6OjMiLCJ2YWx1ZSI6InZhbHVlOjozIiwiY291bnQiOjN9LHsiZGF0YSI6ImRhdGE6OjQiLCJ2YWx1ZSI6InZhbHVlOjo0IiwiY291bnQiOjR9LHsiZGF0YSI6ImRhdGE6OjUiLCJ2YWx1ZSI6InZhbHVlOjo1IiwiY291bnQiOjV9LHsiZGF0YSI6ImRhdGE6OjYiLCJ2YWx1ZSI6InZhbHVlOjo2IiwiY291bnQiOjZ9LHsiZGF0YSI6ImRhdGE6OjciLCJ2YWx1ZSI6InZhbHVlOjo3IiwiY291bnQiOjd9LHsiZGF0YSI6ImRhdGE6OjgiLCJ2YWx1ZSI6InZhbHVlOjo4IiwiY291bnQiOjh9LHsiZGF0YSI6ImRhdGE6OjkiLCJ2YWx1ZSI6InZhbHVlOjo5IiwiY291bnQiOjl9XQ=="

问题似乎在于REST绑定模式是“自动”并使用自定义封送处理程序。如果我将绑定模式设置为"json“,那么浏览器和客户端的响应都会被混淆。如果我将绑定模式设置为"json“并绕过自定义封送拆收器,一切都会正常工作。是否有一种方法可以配置路由以使用自定义封送处理程序并正确编码响应,而不管客户端是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-12-04 23:02:07

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

票数 10
EN

Stack Overflow用户

发布于 2016-07-28 08:18:56

要做到这一点,你有两种方法:

  1. 关闭RestBindingMode,因为否则RestBindingProcessor中的RestBindingMarshalOnCompletion将被注册并手动(Un)封送。
  2. 注册您自己的DataFormat并在RestBinding中自动使用它。通过jsonDataFormat配置REST配置以设置自定义数据格式。 Map dataFormats = getContext().getDataFormats();if (dataFormats == null) { dataFormats =新HashMap<>();} dataFormats.put("yourFormat",新DataFormatDefinition(新CustomDataFormat();
票数 4
EN

Stack Overflow用户

发布于 2017-01-03 09:54:21

您还可以创建自己的数据格式,如下所示:

在您的custom配置中,它将如下所示(参见json-定制)

代码语言:javascript
复制
    builder.restConfiguration().component("jetty")
                        .host(host(propertiesResolver))
                        .port(port(propertiesResolver))
                        .bindingMode(RestBindingMode.json)
                        .jsonDataFormat("json-custom")
                ;

您必须创建一个文件“json-定制”

  • 这是文件的名称,该文件应该包含实现您自己的封送和解封处理方法的类名.
  • 它必须位于您的jar中:META-INF\services\org\apache\camel\dataformat

因此,文件的内容应该是:

代码语言:javascript
复制
class=packageofmyclass.MyOwnDataformatter
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27301869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档