如何映射Apache camel HTTP组件对REST请求的响应

时间:2016-08-22 09:56:02

标签: apache-camel

我已经使用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>

功能按预期发生。但是camel返回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

1 个答案:

答案 0 :(得分:0)

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