如何更改此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<IDialect>) in the type TemplateEngine is not applicable for the arguments (Set<SpringSecurityDialect>)
答案 0 :(得分:2)
今天我对这个问题猛烈抨击了一段时间。答案在于查看Spring Boot源代码:
@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();
}
答案 1 :(得分:1)
根据您的配置,属性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();
}
答案 2 :(得分:0)
您可以使用与此类似的代码实例化整个引擎。
FileSystemXmlApplicationContext appCtx = new FileSystemXmlApplicationContext("myconfigfile.xml");
if (appCtx.containsBean("templateEngine") {
SpringTemplateEngine engine = (SpringTemplateEngine) appCtx.getBean("templateEngine");
}
将应用您在xml配置文件中在引擎上设置的其他方言和任何其他属性。
您可能希望在我的示例中使用ClassPathXmlApplicationContext而不是FileSystem。