【发布时间】:2016-01-30 14:53:59
【问题描述】:
简而言之,我想要实现的是为我拥有的每个项目加载多个视图解析器。我们如何以编程方式添加视图解析器?
我的结构如下:
|__ 父母
|______acc1
|______acc2
|______acc3
|______...
我的代码:
@Configuration
@ComponentScan(basePackages = {"com.compname.services"})
public class YPIPortletConfig implements BeanDefinitionRegistryPostProcessor {
/**
* Logger
*/
private BeanReference createResolver(String beanName, File file, int order, BeanDefinitionRegistry registry) throws BeansException {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FileTemplateResolver.class).setLazyInit(true);
// Utilise le « file » en tant que propriété de ta bean
builder.addPropertyValue("cacheable", false);
builder.addPropertyValue("templateMode", "HTML5");
builder.addPropertyValue("order", order);
builder.addPropertyValue("prefix", file.getAbsolutePath());
AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
registry.registerBeanDefinition(beanName, beanDefinition);
return new RuntimeBeanNameReference(beanName);
}
private BeanReference createTemplateEngine(BeanDefinitionRegistry registry) throws BeansException {
String beanName = "templateEngine1";
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(SpringTemplateEngine.class).setLazyInit(true);
// Utilise le builder pour ajouter ta liste en tant que propriété
// builder.addPropertyValue("templateResolvers", set);
Set<BeanReference> set = new LinkedHashSet<BeanReference>();
set.add(new RuntimeBeanNameReference("templateResolver1"));
set.add(new RuntimeBeanNameReference("templateResolver2"));
set.add(new RuntimeBeanNameReference("templateResolver3"));
set.add(new RuntimeBeanNameReference("templateResolver4"));
builder.addPropertyValue("templateResolvers", set);
AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
registry.registerBeanDefinition(beanName, beanDefinition);
return new RuntimeBeanNameReference(beanName);
}
public BeanReference createThymeleafViewResolver(BeanDefinitionRegistry registry) {
String beanName = "viewResolver";
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ThymeleafViewResolver.class).setLazyInit(true);
builder.addPropertyValue("characterEncoding", "UTF-8");
// builder.addPropertyValue("templateEngine", createTemplateEngine(registry));
builder.addPropertyReference("templateEngine", "templateEngine1");
AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
registry.registerBeanDefinition(beanName, beanDefinition);
return new RuntimeBeanNameReference(beanName);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
createResolver("templateResolver1", new File ("C:/liferay/myFolder/acc_1/resources"), 0, registry);
createResolver("templateResolver2", new File ("C:/liferay/myFolder/acc_2/resources"), 1, registry);
createResolver("templateResolver3", new File ("C:/liferay/myFolder/acc_3/resources"), 2, registry);
createResolver("templateResolver4", new File ("C:/liferay/myFolder/vir_4/resources"), 3, registry);
createTemplateEngine(registry);
createThymeleafViewResolver(registry);
}
}
如果我尝试加载一个路径,一切都很好。
我必须这样做 java 样式而不是 xml 样式,因为我需要循环在外部文件中定义的动态数量的文件夹上。
我遇到的异常如下:
org.springframework.beans.factory.BeanCreationException:创建名为“viewResolver”的bean时出错:设置bean属性“templateEngine”时无法解析对bean“templateEngine1”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“templateEngine1”的 bean 时出错:bean 初始化失败;嵌套异常是 org.springframework.beans.ConversionNotSupportedException:无法将类型“java.util.LinkedHashSet”的属性值转换为属性“templateResolvers”所需的类型“java.util.Set”;嵌套异常是 java.lang.IllegalStateException:无法将类型 [org.springframework.beans.factory.config.RuntimeBeanNameReference] 的值转换为属性“templateResolvers [0]”所需的类型 [org.thymeleaf.templateresolver.ITemplateResolver]:没有匹配找到编辑器或转换策略 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469)由于我是两个框架(sp 和 th)的新手,因此非常感谢任何深入的解释(如果可能)。
谢谢。
【问题讨论】:
标签: java spring-mvc thymeleaf