2014-04-10 88 views
0

我想創建兩個單獨的freemarker配置實例。我有抽象類這樣Freemarker多個配置實例

public abstract class AbstractFreemarkerConfiguration { 

Logger logger = LoggerFactory.getLogger(AbstractFreemarkerConfiguration.class); 

Configuration cfg = new Configuration(); 

public AbstractFreemarkerConfiguration() throws IOException, TemplateModelException { 
    logger.info("Initializing Freemarker Config"); 
    cfg.setDefaultEncoding("UTF-8"); 
    setTemplateExceptionHandler(); 
    cfg.setSharedVariable("layout", getLayoutDirectives()); 
    cfg.setTemplateUpdateDelay(0); 
    cfg.setLocalizedLookup(false); 

} 

@Autowired 
@Qualifier("databaseTemplateLoader") 
public void setTemplateLoader(TemplateLoader loader){ 
    logger.info("Setting hibernate teplate loader"); 
    cfg.setTemplateLoader(loader); 

} 

public abstract void setTemplateExceptionHandler(); 
} 

然後,我有兩個類這樣

@Component("freemarkerProcessor") 
public class FreemarkerTemplateProcessor extends AbstractFreemarkerConfiguration implements TemplateProcessor { 

public FreemarkerTemplateProcessor() throws IOException, TemplateModelException { 
    super(); 
} 

private Environment process(Object template) { 
    Writer writer = new NullWriter(); 
    //do stuff 
} 

@Override 
public List<String> getIncludes(Object template) { 
    //do stuff 
} 

@Override 
public void setTemplateExceptionHandler() { 
    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); 
} 

} 

和第二個是基本相同的,但模板化異常處理程序設置爲RETHROW_HANDLER

我的問題是,當我這樣做,並且我在IGNORE HANDLER中得到異常時,它將通過RETHROW而忽略它。

在調試中,我確定我必須將Configuration和TemplateExpetionHandler的實例分開,所以我不知道爲什麼我會在IGNORE HANDLER中收到異常。

配置設置是否存在某些全局虧損或者我不知道的事情?

感謝您的回覆。

+0

有什麼類型的例外是你看到這個? TemplateExceptionHandler只處理TemplateException的實例。 –

+0

它的TemplateException關於模型中缺少的數據。 –

+0

不,沒有全局緩存或類似的'TemplateExceptionHandler'。您是否曾嘗試過在第一種情況下使用IGNORE_HANDLER?因爲如果這種行爲改變了,那麼這就證明了這一點(1)IGNORE_HANDLER正在按預期工作,並且(2)由於某種原因,您正在使用第1個cfg,而您正在使用第2個。 – ddekany

回答

0

所以我想通了。我有兩次春季服務,IGNORE和RETHROW。我用RETHROW從那個獲得了freemarker模板對象,看起來模板對象保持基於原始配置的ExceptionHandler設置。

所以,當我在IGNORE之一處理一個來自RETHROW的模板時,它仍然使用RETHROW,因爲該模板來自該配置。

當我從IGNORE載入模板時,即使在RETHROW模板上也會忽略它。 這對我來說絕對是意想不到的行爲。