我有一个我用作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
异常说明TypeConverters,我现在还需要实现类型转换器吗?如果是的话怎么办?我已经通过Camel文档进行类型转换器,但我不太了解它。 另外我猜大多数人都明白我想要达到的目标,所以如果你们有任何不同的方法来完成这个或一些建议,请发布。
答案 0 :(得分: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 ...
}