骆驼从类路径资源中读取文件?

Camel read file from classpath resource?

我在 Spring 引导应用程序的 "resources/file.txt" 类路径中有一个文件。

如何在 Camel 路线中引用它?

我试过:

from("file:resource:classpath:?fileName=file.txt") 及其变体。似乎没有任何效果。

这里有什么解决方法吗?

谢谢

您不能为此使用文件组件,因为它旨在通过 java.io.File API 读取 - 例如文件系统上的常规文件。还有许多选项用于文件特定任务,例如读取锁定、移动文件以避免在处理后再次读取它们、删除文件以及扫描到子文件夹等。通过文件交换数据时需要的所有类型的任务.

要读取 JAR 文件中的资源,那么您 Java API 或流组件。

您可以使用 Simple Language

但是,该文件不得包含它无法执行的简单语言的指令,例如"${foo.bar}".

在这种情况下,一个小的 Groovy 脚本会有所帮助。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-groovy</artifactId>
    <version>${version.camel}</version>
</dependency>

ReadClasspathResource.groovy

import java.nio.charset.Charset
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths

import org.apache.camel.Exchange

if ( ! request.body ) {
    throw new IllegalStateException('ResourcePath in body expected.')
}

URL url = Exchange.getClass().getResource(request.body)
Path path = Paths.get(url.toURI())
result = new String(Files.readAllBytes(path), Charset.forName("UTF-8"))

将文件保存在类路径中,例如/src/main/resources/groovy/ReadClasspathResource.groovy

CamelReadClasspathResourceTest.java

/**
 * Read the file /src/main/resources/foobar/Connector.json
 */
public class CamelReadClasspathResourceTest extends CamelTestSupport
{
    @Test
    public void run()
        throws Exception
    {
        Exchange exchange = template.send("direct:start", (Processor)null);

        Object body = exchange.getMessage().getBody();
        System.out.println("body ("+body.getClass().getName()+"): "+body.toString());
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("direct:start")
                    .setBody().constant("/foobar/Connector.json")
                    .setBody().groovy("resource:classpath:/groovy/ReadClasspathResource.groovy")
                    .to("mock:result");
            }
        };
    }
}