【发布时间】:2018-02-23 20:25:18
【问题描述】:
请帮帮我。我的网络应用程序使用 Spring MVC 和 Freemarker 2.3.23。当我启动我的应用程序时,我有:“警告:不会加载自定义 EL 函数,因为没有指定 ObjectWrapper”。我尝试通过以下几种方式指定 ObjectWrapper:
@Configuration
public class CustomFreemarkerConfiguration extends WebMvcConfigurerAdapter {
@Bean
@Autowired
public TaglibFactory taglibFactory(ServletContext servletContext) throws
IOException, TemplateException {
DefaultObjectWrapperBuilder owb = new
DefaultObjectWrapperBuilder(freemarker.template.
Configuration.VERSION_2_3_23);
owb.setForceLegacyNonListCollections(false);
owb.setDefaultDateType(TemplateDateModel.DATETIME);
DefaultObjectWrapper build = owb.build();
TaglibFactory taglibFactory = new TaglibFactory(servletContext);
taglibFactory.setObjectWrapper(build);
return taglibFactory;
}
}
或
@Configuration
public class CustomFreemarkerConfiguration extends WebMvcConfigurerAdapter {
@Bean
public DefaultObjectWrapper getDefaultObjectWrapper() {
DefaultObjectWrapperBuilder defaultObjectWrapperBuilder = new
DefaultObjectWrapperBuilder(freemarker.template.
Configuration.VERSION_2_3_23);
defaultObjectWrapperBuilder.setExposeFields(true);
DefaultObjectWrapper defaultObjectWrapper =
defaultObjectWrapperBuilder.build();
return defaultObjectWrapper;
}
}
或
@Configuration
public class CustomFreemarkerConfiguration extends WebMvcConfigurerAdapter {
...
@Bean
@Autowired
public TaglibFactory taglibFactory(ServletContext servletContext) throws
IOException, TemplateException {
FreeMarkerConfigurer freemarkerConfig =
configFreeMarkerConfigurer(servletContext);
TaglibFactory taglibFactory = freemarkerConfig.getTaglibFactory();
taglibFactory.setObjectWrapper(freemarker.template.Configuration.
getDefaultObjectWrapper(freemarker.template.Configuration.getVersion()));
return taglibFactory;
}
...
}
但没有成功。也许有人有工作示例代码来指定 ObjectWrapper?
【问题讨论】:
-
您确定 Spring Boot 甚至会尝试将这些 bean 注入“自身”吗?我已经看到其他人定义了一个
org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurerbean ......所以它可能至少被它使用了。这也是在 Spring 中坏掉的类;当TemplateContext和Configuration都准备好时,它应该创建和设置TaglibFactory,然后它应该调用taglibFactory.setObjectWrapper(configuration.getObjectWrapper())。 -
我的意思是
ServletContext我说的是TemplateContext... -
我试图在我的 FreeMarkerConfigurer 中这样做:@Bean public FreeMarkerConfigurer getFreeMarkerConfigurer() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPaths("/", "/WEB-INF/views"); TaglibFactory taglibFactory = new TaglibFactory(servletContext); taglibFactory.setObjectWrapper(defaultObjectWrapper);返回配置器;} 但它不起作用。我仍然有警告。请给我一个代码示例。
-
好的,看看我的 guess 作为答案...但是上面评论中的代码肯定不起作用,因为您没有通过您创建的
TaglibFactory任何东西,所以你只是用它来喂 GC。 -
顺便说一句,FreeMarker 2.3.23 是旧的;升级它。不过,这与您的问题无关。
标签: spring freemarker