Reputation: 1695
how can i change this xml configuration :
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
...
<property name="additionalDialects">
<set>
<bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
</set>
</property>
...
</bean>
to a java code configuration so far i have this i only have problems in this part :
<property name="additionalDialects">
<set>
<bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
</set>
</property>
this is what i have so far in java code :
@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;
}
this line give me this error: The method setAdditionalDialects(Set<IDialect>) in the type TemplateEngine is not applicable for the arguments (Set<SpringSecurityDialect>)
Upvotes: 0
Views: 1394
Reputation: 35151
I banged my head against this for a while today. The answer lay in looking at the Spring Boot source:
@Configuration
@ConditionalOnClass({ SpringSecurityDialect.class })
protected static class ThymeleafSecurityDialectConfiguration {
@Bean
@ConditionalOnMissingBean
public SpringSecurityDialect securityDialect() {
return new SpringSecurityDialect();
}
}
So Spring Boot (well, "org.springframework.boot:spring-boot-starter-thymeleaf") will try to inject the org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect. Perhaps it's not working because I have the springsecurity4 jar.
In any case, there's a simple fix: just do what Spring Boot tries to do. In an @Configuration class, just add the bean:
@Bean
public SpringSecurityDialect securityDialect() {
return new SpringSecurityDialect();
}
Upvotes: 2
Reputation: 201
According to your config, property additionalDialects
should assigned with a Set containing one bean. So in javaconfig just create an instance of HashSet, add to it SpringSecurityDialect
bean and assign the resulting set to additionalDialects
property.
SpringSecurityDialect
bean should be created by method annotated with @Bean
to let Spring application context know about this bean to execute bean initializers and postprocessors.
Following code illustrates it:
@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();
}
Upvotes: 1
Reputation: 49
You could instantiate the entire engine using code similar to this.
FileSystemXmlApplicationContext appCtx = new FileSystemXmlApplicationContext("myconfigfile.xml");
if (appCtx.containsBean("templateEngine") {
SpringTemplateEngine engine = (SpringTemplateEngine) appCtx.getBean("templateEngine");
}
The additional dialects and any other properties you've set on the engine in your xml configuration file will be applied.
You might want to look at using ClassPathXmlApplicationContext instead of the FileSystem one in my example.
Upvotes: 0