骆驼从类路径资源中读取文件?
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");
}
};
}
}
我在 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");
}
};
}
}