1

Camel Proxy Using Camel Proxyとして使用しているインターフェイスがあります。私のルートは以下の通りです:

from("direct:services")
        .onException(Exception.class)
        .process(new Processor() {
            @Override
            public void process(Exchange arg0) throws Exception {
                Exception e = arg0.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
                    LOGGER.error(e, e.getMessage());
            }
        }).handled(true).end()
        .setHeader(Exchange.HTTP_URI, simple("${body.url}"))
        .setHeader(Exchange.HTTP_METHOD,simple("${body.httpMethod}"))
        .setHeader(Exchange.CONTENT_TYPE, simple("${body.contentType}"))
        .setBody(simple("${body.requestBody}"))
        .choice()
        .when(simple("${body.proxyRequired} == 'true'"))
        .inOut("{{http.urlProxy}}")
        .otherwise()
        .inOut("{{http.url}}")
        .end()
        .setBody(bean(appUtil, "extractResponse"));

インターフェイスは次のとおりです。

public interface ApiServices {

    ServiceProviderResponse performOperation(ServiceProviderRequest request);

}

ServiceProviderResponse および ServiceProviderRequest クラス:

public class ServiceProviderRequest {

    private String url;
    private String requestBody;
    private String httpMethod;
    private String contentType;
    private boolean proxyRequired;
    private Map<String, String> headers;

//getters and setters

}

public class ServiceProviderResponse {

    private int statusCode;
    private String body;
    private String errorMessage;
    private String contentType;
    private String url;

//getters and setters
}

これは、この全体がどのように機能するかです:

@Produce(uri = "direct:services")
ApiServices appServices;

ServiceProviderResponse response =  appServices.performOperation(request);

以前の私のインターフェイスのメソッドは :ServiceProviderResponse performOperation(String url);で、うまく機能しました (もちろん、以前のルートは異なっていました)。では、このようなカスタム オブジェクト タイプを使用できないものなのでしょうか? 私が得る例外:

Caused by: org.apache.camel.InvalidPayloadException: No body available of type: com.common.util.ServiceProviderResponse but has value: BeanInvocation public abstract com.common.util.ServiceProviderResponse com.common.util.ApiServices.performOperation(com.common.util.ServiceProviderRequest) with [com.common.util.ServiceProviderRequest@4ce55b]] of type: org.apache.camel.component.bean.BeanInvocation on: Message: BeanInvocation public abstract com.common.util.ServiceProviderResponse com.common.util.ApiServices.performOperation(com.common.util.ServiceProviderRequest) with [com.common.util.ServiceProviderRequest@4ce55b]]. Caused by: No type converter available to convert from type: org.apache.camel.component.bean.BeanInvocation to the required type: com.common.util.ServiceProviderResponse with value BeanInvocation public abstract com.common.util.ServiceProviderResponse com.common.util.ApiServices.performOperation(com.common.util.ServiceProviderRequest) with [com.common.util.ServiceProviderRequest@4ce55b]]. Exchange[Message: BeanInvocation public abstract com.common.util.ServiceProviderResponse com.common.util.ApiServices.performOperation(com.common.util.ServiceProviderRequest) with [com.common.util.ServiceProviderRequest@4ce55b]]]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: org.apache.camel.component.bean.BeanInvocation to the required type: com.common.util.ServiceProviderResponse with value BeanInvocation public abstract com.common.util.ServiceProviderResponse com.common.util.ApiServices.performOperation(com.common.util.ServiceProviderRequest) with [com.common.util.ServiceProviderRequest@4ce55b]]]
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:102)
    at org.apache.camel.component.bean.AbstractCamelInvocationHandler.getBody(AbstractCamelInvocationHandler.java:58)
    at org.apache.camel.component.bean.AbstractCamelInvocationHandler.afterInvoke(AbstractCamelInvocationHandler.java:148)
    at org.apache.camel.component.bean.AbstractCamelInvocationHandler$1.call(AbstractCamelInvocationHandler.java:85)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at org.apache.camel.component.bean.AbstractCamelInvocationHandler.invokeWithbody(AbstractCamelInvocationHandler.java:101)
    at org.apache.camel.component.bean.CamelInvocationHandler.invoke(CamelInvocationHandler.java:44)
    ... 43 more
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.apache.camel.component.bean.BeanInvocation to the required type: com.common.util.ServiceProviderResponse with value BeanInvocation public abstract com.common.util.ServiceProviderResponse com.common.util.ApiServices.performOperation(com.common.util.ServiceProviderRequest) with [com.common.util.ServiceProviderRequest@4ce55b]]
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:147)
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:100)
    ... 50 more

Exception は TypeConverters について何かを言っていますが、今も型コンバーターを実装する必要がありますか? はいの場合、それを行う方法は?タイプコンバーターのキャメルドキュメントは既に読んでいますが、あまり理解していません。また、ほとんどの人は私が達成したいことを理解していると思いますので、これを達成するための別の方法や提案があれば投稿してください.

4

1 に答える 1

1

メッセージ本文をbean(appUtil、 "extractResponse")に設定しています。これは、基本的に次のことを意味します。

'メッセージ本文をbean(args)メソッドによって返されるオブジェクトに設定します。 "

appUtilがBeanの場合、extractResponseはServiceProviderResponseインスタンスを返すメソッドであり、次の代わりに次のようになります。

 .setBody(bean(appUtil, "extractResponse"));

試す:

//call to bean() as a last thing in your route def
//...
.bean(appUtil, "extractResponse"); // without the wrapping setBody call.

extractResponseは次のように宣言する必要があります。

ServiceProviderResponse extractResponse(WhateverBodyTypeYouHadOnRoute body) {
    //return ...
}
于 2012-12-15T15:32:58.560 に答える