当前位置: 首页 > 知识库问答 >
问题:

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

宋高谊
2023-03-14

现在,我有一个简单的Spring Boot应用程序,它为静态图像提供服务,我将这些图像放在了resources/static/img中。这对于显示实际内容来说很好,但我想解决两件事:

>

  • 我不希望这些图像中的任何一个与生成的. jar文件捆绑在一起,我知道将这些图像放在资源文件夹中会做到这一点。

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

    我试图通过设置资源处理程序来解决这个问题,但我不确定这是否与从资源/静态提供服务有什么不同。不幸的是,我仍在努力正确配置,因为我根本看不到任何图像。以下是我尝试的内容:

    @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在本地主机8080/img/{image name}上提供的图像。如果可能的话,我希望能够在应用程序运行时将内容添加到此文件夹,并让Spring自动为其提供服务,而无需重新启动它。

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

  • 共有3个答案

    梁丘俊材
    2023-03-14

    用你的第2点来解决问题。

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

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

    只访问本地主机:8080/img/yourmage。巴布亚新几内亚

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

    袁鸿达
    2023-03-14

    使用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的选择是个人的,你可以选择你想要的。注意,你的应用程序需要有良好的管理员权限来创建符号链接。

    施茂
    2023-03-14

    这种方法的问题是,在运行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);
        }
    

    并删除所有File("."). getCanonicalPath()相关的东西,它就会起作用。当您在选定的目录中有新映像时,您的方法将适合您的需求。

     类似资料:
    • 我有一个私有int数组,我需要以某种方式找到长度,但在静态类下无法做到这一点。我必须保持类的静态,是否可以添加其他方法来将a.length更改为其他方法? 该问题是由a.length引起的。

    • 我无法访问静态内容(angular app),甚至无法访问简单的索引。来自spring boot的html文件。我一直收到404错误。Spring没有为我提供这些静态文件。自从升级到Spring Boot 2.2.4后,我就遇到了这个问题。我必须升级以应对Zip64问题。 我的application.properties里有这样一句话: 我也有自己的staticResourceConfigurat

    • 因此,我正在IntelliJ开发一个spring boot应用程序。使用Gradle,我创建了sprint引导jar文件。 我很难确定将JSP和静态内容(如。js文件)放在哪里,这样运行jar和从IntelliJ内部运行都能正常工作!

    • 我有一个学校作业,要做一个程序,结果要么正确,要么错误。这关系到一年是否是闰年。目前的问题是,我使用的是公共静态布尔值,而不是公共布尔值。这是我的代码: 现在int年是2000年,但是规则是这样的:闰年是一年,可以除以4,除非这一年是一个新世纪的开始(1700, 1800, 1900.....)。所以即使你可以把1900除以4,你也不能把它除以400,所以这是错误的。所以再一次问一个问题:我需要做

    • 问题内容: 我正在从数据库中成功获取数据值。我也将它们存储到一个数组中。我需要将String数组作为项的加载,以响应执行的关键操作。每当获取按键值时,如何获取按键值,就如何重新加载项目。相反,我需要动态刷新项目。 问题答案:

    • 在V9.0.0版本之前为下列对象分配内存采用动态的方式,在之后的版本才允许应用程序开发者自己静态的分配内存; 任务 软件定时器 队列 事件组 二值信号量 计数信号量 递归信号量 互斥量 当然,具体使用静态分配还是动态分配由开发者自己决定。 动态分配 动态分配的好处在于使用灵活简单、同时潜在的可以降低内存占用。 更少的函数参数 内存分配使用RTOS提供的API自动分配 应用程序开发者不需要自己去考虑