spring-boot application

时间:2016-01-26 00:11:05

标签: java spring spring-mvc tomcat spring-boot

我有一个带有嵌入式Tomcat的spring boot应用程序。 我想曝光一些图像文件&通过tomcat目录列表从不同位置的文件夹。所以我在名为

的配置文件中添加了以下内容
public class AppConfig extends WebMvcConfigurerAdapter

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:///xxx/yyy/images/");
    }
}

如果我知道名字,我现在可以访问单个图像。

示例:localhost:8080 / images / file.jpg。

但由于目录列表默认为false,我无法通过“localhost:8080 / images /”访问图像列表以了解所有可用图像。

我尝试了下面的选项来添加列表,但是没有用。

public class MyApplication implements ServletContextInitializer{

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("listings", "true");
    }
}

3 个答案:

答案 0 :(得分:0)

以与SpringBoot Embedded Tomcat JSPServlet Options相同的方式,您可以使用EmbeddedServletContainerCustomizer @Bean查找默认servlet并配置其init参数。

@Bean
public EmbeddedServletContainerCustomizer customizer() {
    return new EmbeddedServletContainerCustomizer() {

        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                customizeTomcat((TomcatEmbeddedServletContainerFactory) container);
            }
        }

        private void customizeTomcat(TomcatEmbeddedServletContainerFactory tomcat) {
            tomcat.addContextCustomizers(new TomcatContextCustomizer() {

                @Override
                public void customize(Context context) {
                    Wrapper defServlet = (Wrapper) context.findChild("default");
                    defServlet.addInitParameter("listings", "true");
                }
            });
        }
    };
}

感谢Andy Wilkinson。

答案 1 :(得分:0)

在springboot / **中映射到ResourceHttpRequestHandler。调用永远不会被委托给DefaultServlet以使列表生效。我不得不再对Mark的解决方案进行两次调整才能让它发挥作用。

  1. 向DefaultServlet添加不同的映射 - > “/静态/ *”
  2. 提供静态内容的文档库是一个tmp文件夹。我必须将它设置为存在静态内容的文件夹。

            public void customize(Context context) {
                context.setDocBase("../../../mytest");
                Wrapper defServlet = (Wrapper) context.findChild("default");
                defServlet.addInitParameter("listings", "true");
                defServlet.addInitParameter("readOnly", "false");
                defServlet.addMapping("/static/*");
            }
    
  3. 
        Deployment folder structure
        /myhome/mytest
        ----myapp.jar
        ----/tomcat/webapps
        ----/static
        --------All static files go here
    
        application.yml
        server :
         tomcat :
          basedir : tomcat
    
        Current working dir to run the app /myhome/mytest
    
        url to test : http://localhost:8080/static
    

答案 2 :(得分:0)

已针对Spring 2.1更新

import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>  {

    @Value("${tomcat.file.base}")  // C:\\some\\parent\\child
    String tomcatBaseDir;

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        // customize the factory here
        TomcatContextCustomizer tomcatContextCustomizer = new TomcatContextCustomizer() {
            @Override
            public void customize(Context context) {
                String parentFolder = tomcatBaseDir.substring(0,tomcatBaseDir.lastIndexOf("\\"));
                String childFolder = tomcatBaseDir.substring(tomcatBaseDir.lastIndexOf("\\") + 1);
                context.setDocBase(parentFolder);
                Wrapper defServlet = (Wrapper) context.findChild("default");
                defServlet.addInitParameter("listings", "true");
                defServlet.addInitParameter("readOnly", "false");
                defServlet.addMapping("/"+ childFolder + "/*");
            }
        };
        factory.addContextCustomizers(tomcatContextCustomizer);

    }
}