如何使用数据库中的值设置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视图被存储,所以不同的主题有不同的布局。