如何使用数据库中的值设置 InternalResourceViewResolver 前缀?

How to set InternalResourceViewResolver prefix with value from database?

我有一个基于 Spring MVC 4 的 CMS,我希望用户从不同的视觉主题中进行选择。它们存储在单独的文件夹中。

目前,主题名称在 Properties.THEME_NAME 中被硬编码,但我想将值存储在数据库中并作为 InternalResourceViewResolver 的前缀部分加载。因此用户可以更改它并切换到另一个主题。当应用程序为 运行 时,是否可以动态地进行此更改?

我的配置代码:

@EnableWebMvc
@Configuration
@ComponentScan({ "shop.main.*" })
@Import({ SecurityConfig.class })
@PropertySource("classpath:application.properties")
public class AppContextConfig extends WebMvcConfigurerAdapter {


    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/pages/" + Properties.THEME_NAME + "/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

// other methods

}

实现我的目标的一种方法是扩展 InternalResourceViewResolver 并将 getter 方法覆盖为动态加载 return 前缀。 所以配置更改为:

@Bean
public ThemedResourceViewResolver internalResourceViewResolver() {
    ThemedResourceViewResolver resolver = new ThemedResourceViewResolver();

    resolver.setSuffix(".jsp");
    return resolver;
}

和自定义解析器 class:

public class ThemedResourceViewResolver extends InternalResourceViewResolver {
@Autowired
private SitePropertyDAO sitePropertyDAO;

    protected String getPrefix() {
        String prefix = "/pages/" + Properties.THEME_NAME + "/";
        SiteProperty property = sitePropertyDAO.findOneByName(Constants.THEME);
        if (property != null) {
            prefix = "/pages/" + property.getContent() + "/";
        }
        return prefix;
    }
}

我使用这种方法是因为我不仅需要更改 CSS 文件路径或属性,还需要更改存储我的 .jsp 视图的文件夹,因此不同的主题具有不同的布局。