关于java:由org.apache.camel.NoTypeConversionAvailableException引起:没有类型转换器可用于将类型:POJO转换为byte []

Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: POJO to byte[]

我是Apache Camel的新手。我将REST API与Apache Camel和Spring Boot集成在一起使用。我已经完成了获取请求,它正在按预期方式工作。但是,在使用POST调用发布数据时,我遇到了一个问题。

我在下面的链接中看到了一些类似的错误。但是,这对我没有帮助。
org.apache.camel.NoTypeConversionAvailableException:没有类型转换器可用于从类型:

进行转换

我已经尝试了Stackoverflow,youtube和其他网站中提供的几种解决方案。但是,没有运气。您能帮我解决问题吗,

错误说明:

org.apache.camel.InvalidPayloadException: No body available of type:
byte[] but has value: Bank [id=1, name=TEST, location=Bangalore] of
type: com.ta.common.bean.Bank on:
Message[ID-XDNS01271-1534835668677-10-2]. Caused by: No type converter
available to convert from type: com.ta.common.bean.Bank to the
required type: byte[] with value Bank [id=1, name=TEST,
location=Bangalore]. Exchange[ID-XDNS01271-1534835668677-10-1]. Caused
by: [org.apache.camel.NoTypeConversionAvailableException - No type
converter available to convert from type: com.ta.common.bean.Bank to
the required type: byte[] with value Bank [id=1, name=TEST,
location=Bangalore]] at
org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:117)
at
org.apache.camel.component.netty4.http.DefaultNettyHttpBinding.toNettyRequest(DefaultNettyHttpBinding.java:488)
at
org.apache.camel.component.netty4.http.NettyHttpProducer.getRequestBody(NettyHttpProducer.java:65)
at
org.apache.camel.component.netty4.NettyProducer.process(NettyProducer.java:208)
at
org.apache.camel.component.netty4.http.NettyHttpProducer.process(NettyHttpProducer.java:56)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
at
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:181)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:138) at
org.apache.camel.processor.Pipeline.process(Pipeline.java:101) at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at
org.apache.camel.component.direct.DirectBlockingProducer.process(DirectBlockingProducer.java:53)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
at
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:181)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at
org.apache.camel.component.netty4.handlers.ServerChannelHandler.processAsynchronously(ServerChannelHandler.java:141)
at
org.apache.camel.component.netty4.handlers.ServerChannelHandler.channelRead0(ServerChannelHandler.java:112)
at
org.apache.camel.component.netty4.http.handlers.HttpServerChannelHandler.channelRead0(HttpServerChannelHandler.java:213)
at
io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at
org.apache.camel.component.netty4.http.handlers.HttpServerMultiplexChannelHandler.channelRead0(HttpServerMultiplexChannelHandler.java:113)
at
io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at
io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:38)
at
io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:353)
at
io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66)
at
io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
at java.lang.Thread.run(Thread.java:745)
Caused by:
org.apache.camel.NoTypeConversionAvailableException: No type converter
available to convert from type: com.ta.common.bean.Bank to the
required type: byte[] with value Bank [id=1, name=TEST,
location=Bangalore] at
org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:206)
at
org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:115)
... 29 more

骆驼路由逻辑如下,

1
2
3
4
5
6
7
8
9
restConfiguration().component("netty4-http").bindingMode(RestBindingMode.json).host("localhost").port(8000);

rest("/api").consumes("application/json").post("/addbank").type(Bank.class).to("direct:addbank");

from("direct:addbank").log("request body :
 ${body}"
).to("netty4-http:http://localhost:8181/bank/add?bridgeEndpoint=true").throwException(new
 RuntimeException()).to("direct:cancelAdding");

 from("direct:cancelAdding").log("Cancelled adding bank details");

控制器逻辑为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController

@RequestMapping(path="/bank")

public class BankController {  

     List<Bank> bankList = new ArrayList<>();

     @PostMapping(path="/add",consumes="application/json")
     public List<Bank> addBank(@RequestBody @Valid Bank bank) {
        bankList.add(bank);        
      return bankList;  
     }
 }

Bank.java:

1
2
3
4
5
6
7
private int id;

private String name;

private String location;

//Getter & Setter methods


我无法使用上面的代码完全重现该错误。当我尝试上述代码时,这是我遇到的异常。

org.apache.camel.processor.binding.BindingException: Cannot bind to
json as message body is not json compatible.
Exchange[ID-DESKTOP-OS0TDG5-1534851950401-0-1]

此问题的解决方法是

更改其余配置

1
 restConfiguration().component("netty4-http").host("localhost").bindingMode(RestBindingMode.json)....;

1
 restConfiguration().component("netty4-http").host("localhost").bindingMode(RestBindingMode.auto)....;

或者您可以完全省略绑定模式。