使用驼峰路由提供静态文件

时间:2017-11-21 06:44:37

标签: java apache-camel cxf

我正在尝试在camel路由中提供静态文件。

我的主类中的路由包含这段代码:

public final void configure() throws Exception {
    // declaring camel routes
    // match on uri prefix must be true when parameters are passed as part of the uri
    // for example, "http://localhost/hello/rick"
    // http.port is in local.properties file user-api

    from("jetty:http://0.0.0.0:{{http.port}}/user/dist/?matchOnUriPrefix=true")
      .process( new StaticProcessor( "help", "index.html", "dist"))
      .routeId( "static");

    from("jetty:http://0.0.0.0:{{http.port}}/user?matchOnUriPrefix=true")
    .to("cxfbean:userService");
  }

这很好用。当我点击网址:http://xxxx:8086/user/dist/index.html时,我的索引页面会被呈现,网址会在网址栏中显示为http://xxxx:8086/user/dist/

但是当我重新加载页面时(按F5),网址变为:http://xxxx:8086/user/dist//,我收到如下错误:

  

此页面应该已被Swagger取代。你有吗?   在你的应用程序的pom.xml中作为唯一的引用   招摇-行家-插件?

    <build>
        <plugins>
            <plugin>
                <groupId>com.github.kongchen</groupId>
                <artifactId>swagger-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>swagger</id>
                        <phase>compile</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

我在有效的POM中有这种依赖性。那我错过了什么?

我希望实现任何http://clv035sl-8947d6:8888/user/dist的网址都应该将呼叫路由到index.html。为什么我需要在网址末尾明确写出index.html

任何帮助/建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

我制作了一个简单的JUnit测试用例,根据this blog post来测试你的场景。

StaticProcessor课程的实施在哪里?我为这个场景实现了非常相似的东西(恕我直言):

public void configure() throws Exception {

    from("jetty:http://0.0.0.0:8080/user/dist?matchOnUriPrefix=true").process(new Processor() {

        public void process(Exchange exchange) throws Exception {
            Message in = exchange.getIn();

            String relativepath = in.getHeader(Exchange.HTTP_PATH, String.class);
            String requestPath = in.getHeader("CamelServletContextPath", String.class); //CamelServletContextPath

            if (relativepath.isEmpty() || relativepath.equals("/")) {
                relativepath = "index.html";
            }

            final String formattedPath = String.format("%s/%s", requestPath, relativepath);
            InputStream pathStream = this.getClass().getResourceAsStream(formattedPath);
            Path path = FileSystems.getDefault().getPath(this.getClass().getResource(formattedPath).getPath());

            Message out = exchange.getOut();
            try {
                out.setBody(IOUtils.toByteArray(pathStream));
                out.setHeader(Exchange.CONTENT_TYPE, Files.probeContentType(path));
            } catch (IOException e) {
                out.setBody(relativepath + " not found.");
                out.setHeader(Exchange.HTTP_RESPONSE_CODE, "404");
            }
        }
    }).routeId("static");
}

从类路径中获取需要公开的资源并将out消息设置为响应。请查看整个test case

我测试了以下网址:

请注意,我像你一样添加了swagger插件依赖项。

请告诉我这是否有助于或指出StaticProcessor实施的位置,我可以使用它进行测试并编辑我的答案。

干杯