Java 使用BeanIO和Apache Camel解组InputStream

Java 使用BeanIO和Apache Camel解组InputStream,java,apache-camel,bean-io,Java,Apache Camel,Bean Io,我有一个服务,它接收一个文件并将其发送到驼峰路由。在该路径上,我想使用BeanIO解组该文件,但它无法识别InputStream类型的输入 @RestController @RequestMapping(value = "/file") public class FileController { @Autowired private CamelContext camelContext; @RequestMapping(value = "/upload", method

我有一个服务,它接收一个文件并将其发送到驼峰路由。在该路径上,我想使用BeanIO解组该文件,但它无法识别InputStream类型的输入

@RestController
@RequestMapping(value = "/file")
public class FileController {

    @Autowired
    private CamelContext camelContext;

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public void upload(@RequestParam("file") MultipartFile multipartFile) throws IOException {
        ProducerTemplate template = camelContext.createProducerTemplate();
        template.sendBody("direct:routeTest", new ByteArrayInputStream(multipartFile.getBytes()));
    }

}

@Component
public class SampleRouter extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("direct:routeTest")
                .log("${body}")
                .to("dataformat:beanio:unmarshal?mapping=mapping.xml&streamName=testFile")
                .process(msg -> msg.getIn()
                        .getBody(List.class)
                        .forEach(o -> {...}))
                .end();
    }

}
我已经测试了一个路由,该路由使用file组件读取文件,并将结果发送到BeanIO组件。在这种情况下,它是有效的


如何在ApacheCamel上将BeanIO与InputStream类型的输入一起使用?是否有任何组件可以将我的InputStream转换为与BeanIO组件兼容的东西?

正如mgyongyosi所说,当
.log(${body}”)
读取流时,位置会转到它的末尾。要解决此问题,我们可以在读取InputStream后重置其位置:

from("direct:routeTest")
        .log("${body}")
        .process(exchange -> ((InputStream) exchange.getIn().getBody()).reset())
        .to("dataformat:beanio:unmarshal?mapping=mapping.xml&streamName=testFile")

或者删除行
.log(“${body}”)

,正如mgyongyosi所说,当
.log(“${body}”)
读取流时,位置移到流的末尾。要解决此问题,我们可以在读取InputStream后重置其位置:

from("direct:routeTest")
        .log("${body}")
        .process(exchange -> ((InputStream) exchange.getIn().getBody()).reset())
        .to("dataformat:beanio:unmarshal?mapping=mapping.xml&streamName=testFile")

或者删除行
.log(“${body}”)

其他解决方案可以是向路由添加
.streamCaching()
。然后您可以多次读取同一个流

其他解决方案可以是向路由添加
.streamCaching()
。然后您可以多次读取同一个流

你有什么例外吗?您是否在
日志(“${body}”)
上收到任何输出消息?没有例外
.log(“${body}”)
提供文件的内容。原来问题就出在这条线上。我以为
.log(“${body}”)
会将正文的内容返回到下一个路由,但它不会返回任何内容。当我删除这一行时,它起作用了。是的,当你在InputStream上调用
.log(“${body}”)
时,它读取流,然后位置就在流的末尾。你有任何异常吗?您是否在
日志(“${body}”)
上收到任何输出消息?没有例外
.log(“${body}”)
提供文件的内容。原来问题就出在这条线上。我以为
.log(“${body}”)
会将正文的内容返回到下一个路由,但它不会返回任何内容。当我删除这一行时,它工作了。是的,当您在InputStream上调用
.log(“${body}”)
时,它读取流,然后位置就在流的末尾。