Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring Boot动态更改静态内容_Java_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

Java 使用Spring Boot动态更改静态内容

Java 使用Spring Boot动态更改静态内容,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,现在我有一个简单的Spring启动应用程序,它提供我放在resources/static/img中的静态映像。这对于显示实际内容来说效果很好,但有两件事我想解决: 我不希望这些图像与生成的.jar文件捆绑在一起,我知道将这些图像放在resources文件夹中就可以了 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动。相反,我希望Spring提供存在于特定文件夹中的任何静态内容,这样我就可以在应用程序运行时添加图像,并让它们在localhost:8080/img/

现在我有一个简单的Spring启动应用程序,它提供我放在
resources/static/img
中的静态映像。这对于显示实际内容来说效果很好,但有两件事我想解决:

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

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

  • 我试图通过设置一个资源处理程序来解决这个问题,但我不确定这是否与从
    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自动为它们提供服务,而无需重新启动它


    有人有什么想法吗?提前感谢。

    您的方法的问题是,您在运行spring boot应用程序后设置了
    IMAGE\u DIR
    ,并且常量
    IMAGE\u DIR
    未初始化且为
    null
    。更改如下:

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

    并删除所有
    文件(“.”)。getCanonicalPath()
    相关内容,它就会工作。当您在所选目录中有新映像时,您的方法将适合您的需要。要解决您的问题,请参见第2点

  • 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动。我宁愿 Spring提供特定文件夹中存在的任何静态内容, 因此,我可以在应用程序运行时添加图像并将其保存 在本地主机上自动服务:8080/img/{image name}
  • 您可以在以下位置创建所有这些图像:

    /resources/public
        -img
        -js,...
    
    只访问localhost:8080/img/yourmage.png


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

    使用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));
    

    symlink/tmp/images的选择是个人的,您可以选择您想要的。请注意,您的应用程序需要具有良好的管理员权限才能创建符号链接

    谢谢你的回答。结果证明你说对了一半——我所要做的就是把
    IMAGE\u DIR
    排成一行,效果非常好。谢谢所以这并不能解决问题。每当我们需要在符号链接文件夹中的内容发生更改时重建时,这些资源就无法访问。这并不能解决问题。每次向文件夹添加新内容时,应用程序都需要重新启动,但我需要在不重新启动应用程序的情况下提供文件。