Java Freemarker迭代映射中返回的不需要的值

Java Freemarker迭代映射中返回的不需要的值,java,freemarker,Java,Freemarker,迭代映射时 ${key} 将返回clone、1、getKey、5等 如果我理解的很清楚的话,有没有人能找到解决方案,而不是一个接一个地删除不需要的值?您可以将方法和键混合在一起。这取决于object\u wrapper配置设置(configuration.setObjectWrapper(ObjectWrapper))。如果使用BeansWrapper作为object\u wrapper(与从未出现过此问题的DefaultObjectWrapper)相反),可以通过yourbeanswapp

迭代映射时


${key}

将返回clone、1、getKey、5等


如果我理解的很清楚的话,有没有人能找到解决方案,而不是一个接一个地删除不需要的值?

您可以将方法和键混合在一起。这取决于
object\u wrapper
配置设置(
configuration.setObjectWrapper(ObjectWrapper)
)。如果使用
BeansWrapper
作为
object\u wrapper
(与从未出现过此问题的
DefaultObjectWrapper
)相反),可以通过
yourbeanswapper.setSimpleMapWrapper(true)
防止此问题。然而,在该项目中,它是
false
,这可能不是偶然的。有一个问题是FreeMarker语言没有映射类型。它有一种叫做散列的东西,只支持字符串键(子变量)。因此,人们可能只使用
Java.util.Map
-s的JavaAPI,而不是像
[]
?keys
等散列运算符,并且为此需要
setSimpleMapRapper(false)
,否则就看不到
Map
方法。然后您应该编写
map.keySet()

更新:在2.3.22及更高版本中,由于Java方法(和Java Bean属性)可以通过
?api
在单独的名称空间中访问,如
myMap?api.get(nonStringKey)
myMap?api.keySet()等,因此没有人再被迫使用混合方法和键(即使在当时也是一个相当混乱的解决方法)
等。因此,您可以使用只公开
映射
键并支持
api
功能的
对象包装器
(最好是
对象包装器=默认对象包装器(2.3.22)
),启用
api
api内置
启用=真;默认情况下,它是不允许向后安全的),然后,当您需要Java api名称空间中的内容时,只需使用
?api
,或者使用
[]
?键
,等等。如果
映射
键是
字符串
-s.

请尝试以下语法

<#assign keys = map?keys>
<#list keys as key>${key} = ${h[key]}; </#list>

地图上的数据是什么?你希望得到什么?你的问题不能解释问题。我只有1,2,5个值,但它给了其他值struff@ddekany,+1,我的答案没有意义。我要收回它。而且您的解决方案很好,我知道BeansWrapper实例可能配置不完整,这也是方法也是映射项的原因,感谢您的解决方案。但你的回答并没有解决我的问题。一旦我设置了,为每个模板调用创建新的
BeansWrapper
不是一个好主意,因为
BeansWrapper
总是以空的内省缓存开始。因此,即使在全局设置
ObjectWrapper
时(即在
Configuration
中),由于某种原因也不可行,也应该尝试重用
BeansWrapper
实例,而这些人通常会与其他类似创建的
BeansWrapper
-s重用/共享内省缓存。(此外,返回的
BeansWrapper
可能是一个重用的单例。)您应该接受答案,然后顺便说一句@Nunien:如果
map.keySet()
对您有效,这意味着
?keys
[]
等可以看到OP所面临的混乱局面。见上文更新;人们应该而且现在总是可以避免混合键和成员设置。
 BeansWrapper ow = new BeansWrapper();
  ow.setExposeFields(true);
 // ow.setSimpleMapWrapper(true);

  Template template = freeMarkerConfiguration.getTemplate(templateName, locale);
  template.setObjectWrapper(ow);
  template.process(root, writer);