2014-09-05 98 views
0

我怎麼能這樣xml配置改變:XML bean的配置,java代碼配置

<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

可能重複[瞭解春季@Configuration類用法](http://stackoverflow.com/questions/24014919/understanding-spring-configuration-class-usage ) – Avi 2014-09-05 17:04:05

回答

0

您可以使用類似於此的代碼實例化整個引擎。

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

將應用您在xml配置文件中引擎上設置的其他方言和任何其他屬性。

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

+0

是的,但你仍然需要.xml文件我試圖得到沒有.xml文件的配置,那麼沒有辦法做到沒有XML文件的配置? – stackUser2000 2014-09-05 17:53:04

+0

啊,我誤解了這個問題。它看起來像vp8106有一個以上的答案,就是你想要的。如果這還不是一個滿意的答案,請添加一些說明,我會盡力幫助。 – 2014-09-06 13:48:53

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(); 
} 
+0

請詳細說明,爲什麼這通過編輯您的答案有所幫助。 – 2014-09-05 21:59:52

+0

所以我應該在那種類型的配置'org.thymeleaf.extras.springsecurity3.dialect中傳遞這個字符串。SpringSecurityDialect' – stackUser2000 2014-09-26 21:25:18

+0

@ stackUser2000它不只是一個字符串,它是一個類名,所以把它放在你的javaconfig類的import部分中 – vp8106 2014-09-26 21:38:31

1

我今天撞了我的頭這一段時間。

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(); 
    } 

} 

所以春季啓動(當然,「org.springframework.boot:彈簧引導起動thymeleaf」)會嘗試注入的答案中望春引導源奠定org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect。也許它不起作用,因爲我有springsecurity4 jar。

在任何情況下,都有一個簡單的解決方法:只要做Spring Boot試圖做的事情。在@Configuration類,只需添加豆類:

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

這應該是接受的答案 – lilalinux 2016-10-15 14:05:47