Serving static files with camel routes

痴心易碎 提交于 2019-12-11 00:57:08

问题


I am trying to serve a static file in camel routes.

The routes in my main class contains this piece of code:

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");
  }

This works good. When I hit the url: http://xxxx:8086/user/dist/index.html, my index page is rendered and the url shows to behttp://xxxx:8086/user/dist/ in url bar.

But when I reload the page (press F5), the url becomes: http://xxxx:8086/user/dist// and I get error like:

This page should have been replaced by Swagger. Do you have the following in your application's pom.xml as the only reference to the swagger-maven-plugin?

    <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>

I have this dependency in my effective POM. So what am I missing?

I wish to achieve that any url with http://clv035sl-8947d6:8888/user/dist should route the call to index.html. Why I need to explictly write index.html at end of the url?

Any help/ suggestion will be appreciated.


回答1:


I made a simple JUnit Test case to test your scenario based on this blog post.

Where are the implementation of the StaticProcessor class? I've implemented something for this scenario that is quite similar (IMHO):

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");
}

It takes from the classpath the resources that needed to be exposed and set the out message to the response. Please, take a look at the entire test case.

I've tested the following URLs:

  • http://localhost:8080/user/dist/
  • http://localhost:8080/user/dist
  • http://localhost:8080/user/dist/index.html

Please note that I added the swagger plugin dependency just like you did.

Let me know if that helps or point where the StaticProcessor implementation is that I may test with it and edit my answer.

Cheers



来源:https://stackoverflow.com/questions/47406799/serving-static-files-with-camel-routes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!