【问题标题】:How to map the response for the REST request by Apache camel HTTP component如何通过 Apache camel HTTP 组件映射 REST 请求的响应
【发布时间】:2016-12-28 19:45:13
【问题描述】:

我已经用 Apache camel XML 模式实现了以下路由。

<restConfiguration component="servlet" bindingMode="json" contextPath="/abc-esb/rest" port="8181"> 
    <dataFormatProperty key="prettyPrint" value="true" />
    <dataFormatProperty key="json.in.disableFeatures" value="FAIL_ON_EMPTY_BEANS,FAIL_ON_UNKNOWN_PROPERTIES" />
</restConfiguration>

<rest path="/service-http" consumes="application/json" produces="application/json">
    <put type="com.abc.abcd.esb.models.UserServiceMapping" uri="/create">
        <route>
            <setHeader headerName="Authorization">
                <simple>Basic YWRtaW46YWRtaW4=</simple>
            </setHeader>
            <setHeader headerName="CamelHttpMethod">
                <constant>POST</constant>
            </setHeader>
            <setBody>
                <simple>
                    {"SystemUserDetails":{"userName":"${body.objectDetails.userName}",
                    "password": "${body.objectDetails.password}"}}
                </simple>
            </setBody>
            <to uri="http://192.168.1.20:8081/abcd/services/UserServiceRest/V1.0/users/create?bridgeEndpoint=true" />
        </route>
    </put>
</rest>

功能按预期发生。但骆驼返回 HTTP 500 提及以下错误。

com.fasterxml.jackson.databind.JsonMappingException: 没有序列化程序 找到上课 org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream 并且没有发现创建 BeanSerializer 的属性(以避免 异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS) ) com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69) 在 com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32) 在 com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)

当我分析与此场景相关的 tcp 转储时,我发现在尝试映射来自外部 Web 服务的 {"status" : "Success"} 响应时发生了这个 HTTP 500。

UserServiceMapping 类的内容

    private String serviceName;
    private String serviceMethod;
    private String mappedServiceObject;
    private SystemUserDetails objectDetails;
    // private StatusDetails statusDetails;

    public String getMappedServiceObject() {
        return mappedServiceObject;
    }

    public void setMappedServiceObject(String mappedServiceObject) {
        this.mappedServiceObject = mappedServiceObject;
    }

    public String getServiceName() {
        return serviceName;
    }

    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }

    public String getServiceMethod() {
        return serviceMethod;
    }

    public void setServiceMethod(String serviceMethod) {
        this.serviceMethod = serviceMethod;
    }

    public SystemUserDetails getObjectDetails() {
        return objectDetails;
    }

    public void setObjectDetails(SystemUserDetails objectDetails) {
        this.objectDetails = objectDetails;
    }

    /*
     * public StatusDetails getStatusDetails() { return statusDetails; }
     * 
     * public void setStatusDetails(StatusDetails statusDetails) {
     * this.statusDetails = statusDetails; }
     */

Request response flow of the scenario

【问题讨论】:

  • 由于您在查找序列化实现时遇到问题,您是否尝试过在依赖项中添加一个?通常可以在使用 REST DSL 的骆驼项目中找到像 camel-jacksonjackson-corejackson-databind 和/或 org.json 这样的东西
  • @Udara Seneviratne,请您尝试在simple 标签中添加resultType="java.lang.String" 属性。或在setBody 标记之后添加这样的&lt;convertBodyTo type="java.lang.String"/&gt; 行。
  • @Roman 感谢您的快速回复。我试过你的建议。但问题依然存在。有没有办法映射端点请求的响应?
  • @Aleksei Bulgak 感谢您的回复。我也尝试了您的建议,但问题仍然存在。
  • @UdaraSeneviratne 你能添加你的UserServiceMapping类的内容吗?

标签: apache-camel


【解决方案1】:

到目前为止,我无法找到此问题的确切原因,但我可以通过在我的外部 REST 客户端中设置 Accept: application/xml 而不是 Accept: application/json 来绕过该问题,这使得初始休息请求。 (另一端的 REST 服务端点配置为同时生成 json 和 xml)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多