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

问题描述:

我有一个基于Spring MVC 4的CMS,我希望用户从不同的视觉主题中进行选择。它们存储在单独的文件夹中。如何使用数据库中的值设置InternalResourceViewResolver前缀?

现在主题名称被硬编码在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方法返回前缀加载dinamicaly。 所以配置更改:

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

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

而定制解析器类:

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视图被存储,所以不同的主题有不同的布局。