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

时间:2019-02-10 15:31:07

标签: apache-camel spring-camel

在Spring Boot应用程序的类路径中,我的文件位于“ resources / file.txt”。

我如何在骆驼路线中引用它?

我尝试过:

from(“ file:resource:classpath:?fileName = file.txt”)及其上的变体。似乎没有任何作用。

请问这里有什么解决方法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

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

要读取JAR文件中的资源,请使用Java API或流组件。

答案 1 :(得分:0)

您可以使用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");
            }
        };
    }
}