【问题标题】:xml bean configuration to java code configurationxml bean配置转java代码配置
【发布时间】:2014-10-30 15:29:09
【问题描述】:

如何更改此 xml 配置:

<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
      ...
      <property name="additionalDialects">
        <set>
          <bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
        </set>
      </property>
      ...
    </bean>

到目前为止,我有一个 java 代码配置,我只有这部分有问题:

<property name="additionalDialects">
            <set>
              <bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
            </set>
          </property>

这是我目前在 java 代码中所拥有的:

   @Bean
    public SpringSecurityDialect springSecurityDialect() {
        return new SpringSecurityDialect();
    }

    @Bean 
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine  =  new SpringTemplateEngine();
        engine.setTemplateResolver( templateResolver() );
        engine.setMessageSource( messageSource() );

        //DIALECTS
                Set<SpringSecurityDialect> ssdSet = new HashSet<SpringSecurityDialect>();       
                ssdSet.add( springSecurityDialect() );
                engine.setAdditionalDialects( ssdSet ); <-- this line give me this error
        return engine;
    }

这一行给我这个错误:The method setAdditionalDialects(Set&lt;IDialect&gt;) in the type TemplateEngine is not applicable for the arguments (Set&lt;SpringSecurityDialect&gt;)

【问题讨论】:

标签: java xml spring spring-mvc thymeleaf


【解决方案1】:

今天我用头撞了一会儿。答案在于查看 Spring Boot 源代码:

https://github.com/spring-projects/spring-boot/blob/v1.2.5.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java

@Configuration
@ConditionalOnClass({ SpringSecurityDialect.class })
protected static class ThymeleafSecurityDialectConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public SpringSecurityDialect securityDialect() {
        return new SpringSecurityDialect();
    }

}

所以 Spring Boot(好吧,“org.springframework.boot:spring-boot-starter-thymeleaf”)将尝试注入 org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect。也许它不起作用,因为我有 springsecurity4 jar。

无论如何,有一个简单的解决方法:做 Spring Boot 尝试做的事情。在 @Configuration 类中,只需添加 bean:

@Bean
public SpringSecurityDialect securityDialect() {
    return new SpringSecurityDialect();
}

【讨论】:

    【解决方案2】:

    根据您的配置,additionalDialects 属性应该分配一个包含一个 bean 的 Set。因此,在 javaconfig 中只需创建一个 HashSet 实例,将其添加到 SpringSecurityDialect bean 并将结果集分配给 additionalDialects 属性。 SpringSecurityDialect bean 应该由带有 @Bean 注释的方法创建,以让 Spring 应用程序上下文知道该 bean 以执行 bean 初始化程序和后处理器。
    以下代码说明了这一点:

    @Bean
    public SpringTemplateEngine templateEngine() {
            SpringTemplateEngine engine  =  new SpringTemplateEngine();
            engine.setTemplateResolver( templateResolver() );
            engine.setMessageSource( messageSource() );
            Set<SpringSecurityDialect> ssdSet = new HashSet<SpringSecurityDialect>();
            ssdSet.add( springSecurityDialect() );
            engine.setAdditionalDialects( ssdSet );
    
            return engine;
        }
    
    @Bean
    public SpringSecurityDialect springSecurityDialect() {
        return new SpringSecurityDialect();
    }
    

    【讨论】:

    • 请详细说明,为什么这有助于编辑您的答案。
    • 那么在那种类型的配置中我应该在哪里传递这个字符串org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect
    • @stackUser2000 它不只是一个字符串,它是一个类名,所以把它放在你的 javaconfig 类的 import 部分
    • 嘿朋友,我试试你说的,它给出了这个错误(看看我如何用你的代码编辑我的问题)The method setAdditionalDialects(Set&lt;IDialect&gt;) in the type TemplateEngine is not applicable for the arguments (Set&lt;SpringSecurityDialect&gt;)
    【解决方案3】:

    您可以使用与此类似的代码来实例化整个引擎。

    FileSystemXmlApplicationContext appCtx = new FileSystemXmlApplicationContext("myconfigfile.xml");
    if (appCtx.containsBean("templateEngine") {
       SpringTemplateEngine engine = (SpringTemplateEngine) appCtx.getBean("templateEngine");
    }
    

    将应用您在 xml 配置文件中在引擎上设置的其他方言和任何其他属性。

    您可能想看看在我的示例中使用 ClassPathXmlApplicationContext 而不是 FileSystem 。

    【讨论】:

    • 是的,但你仍然需要 .xml 文件我试图在没有 .xml 文件的情况下获取配置,所以没有 xml 文件就没有办法进行配置吗??
    • 啊,我误解了这个问题。看起来 vp8106 上面有一个答案,可以满足您的要求。如果这也不是一个令人满意的答案,请添加一些说明,我会再次尝试提供帮助。
    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 2015-05-30
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2016-08-18
    相关资源
    最近更新 更多