【问题标题】:multiple template resolvers (thymeleaf) in spring mvcspring mvc中的多个模板解析器(thymeleaf)
【发布时间】: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


    【解决方案1】:

    解决方案是使用 ManagedSet 而不是仅使用 Set

    ManagedSet templateResolversSet = new ManagedSet(); … builder.addPropertyValue("templateResolvers", templateResolversSet);

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2015-04-26
      • 2020-03-14
      • 2020-05-14
      • 1970-01-01
      相关资源
      最近更新 更多