使用Spring Boot

时间:2016-03-29 15:28:35

标签: java spring spring-mvc spring-boot

现在我有一个简单的Spring Boot应用程序,它提供我放在resources/static/img中的静态图像。这适用于显示实际内容,但有两件事我想解决:

  1. 我不希望任何这些图像与生成的.jar文件捆绑在一起,我知道将这些图像放在resources文件夹中就可以了。

  2. 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动它。我希望Spring能够提供特定文件夹中存在的任何静态内容,因此我可以在应用程序运行时添加图像,并在localhost:8080/img/{image name}自动提供它们。

  3. 我尝试通过设置资源处理程序来解决这个问题,但我不确定这与仅仅从resources/static提供它们有什么不同。不幸的是,我仍然在努力正确配置,因为我根本无法看到任何图像。这是我试过的:

    @Configuration
    public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/img/**").addResourceLocations("file:" + Application.IMAGE_DIR);
            super.addResourceHandlers(registry);
        }
    }
    

    这是我的应用程序配置:

    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
        static String IMAGE_DIR;
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
        public static void main(String[] args) throws IOException {
            SpringApplication.run(Application.class, args);
            IMAGE_DIR = new File(".").getCanonicalPath() + "/img/";
        }
    
    }
    

    同样,我的目标是在项目的根目录中设置一个名为img的文件夹,该文件夹将存储我希望webapp在localhost:8080/img/{image name}上投放的图像。如果可能的话,我希望能够在应用程序运行时向该文件夹添加内容,并让Spring自动为它们提供服务,而无需重新启动它。

    有没有人有任何想法?提前谢谢。

3 个答案:

答案 0 :(得分:2)

您的方法的问题是您在运行Spring启动应用程序后设置IMAGE_DIR并且常量IMAGE_DIR未初始化且为null。改变如下:

public static void main(String[] args) throws IOException {
        IMAGE_DIR = "/opt/img/";
        SpringApplication.run(Application.class, args);
    }

并删除所有File(".").getCanonicalPath()相关内容,它会起作用。当您在所选目录中有新图像时,您的方法将满足您的需求。

答案 1 :(得分:0)

用你的观点解决问题2.

  
      
  1. 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动它。我会喜欢   Spring用于提供特定文件夹中存在的任何静态内容,   所以我可以在应用程序运行时添加图像并拥有它们   自动在localhost上提供:8080 / img / {image name}。
  2.   

您可以在以下位置创建所有这些图片:

/resources/public
    -img
    -js,...

并且只访问localhost:8080 / img / yourImage.png

“public”文件夹下的所有内容都可以访问

答案 2 :(得分:0)

为了通过Spring Boot动态提供内容,我找到了一个可行的解决方案。这个想法是将静态内容目录链接到没有缓存的符号链接 ,然后,您只需要在每次需要时重建符号链接。因此,在您的情况下:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/img/**").addResourceLocations("file:/tmp/images/").setCacheControl(CacheControl.noCache());
        super.addResourceHandlers(registry);
    }
}

之后,您可以像这样更改图像目录:

Path link = Paths.get("/tmp/images"); //Symlink
Files.deleteIfExists(link);
Files.createSymbolicLink(link, Paths.get(your_new_images_directory));

符号链接/ tmp / images的选择是个人的,您可以选择所需的内容。请注意,您的应用程序需要具有正确的符号链接创建权限。