假设我正在使用Spring并且有一个控制器,它返回一个包含data
实例的data
字段的模型。在StringBuilder
内,我有一个名为log
的{{1}}。
在JSP中我使用
${data}
我得到了这个输出:
{"log":hello world}
现在,如果我想访问log
我想我可以使用
${data["log"]}
但我得到的只是
javax.el.PropertyNotFoundException: Property 'log' not found on type org.codehaus.jackson.node.ObjectNode
javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:214)
javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:191)
javax.el.BeanELResolver.property(BeanELResolver.java:300)
javax.el.BeanELResolver.getValue(BeanELResolver.java:81)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
org.apache.el.parser.AstValue.getValue(AstValue.java:123)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938)
:
${data.log}
显示相同的内容。
我知道根据EL data.log
在getLog()
上查找方法data
,但IIRC Maps<?,?>
支持对其密钥的这种访问。有没有类似的方法让它与杰克逊合作?或者,如果这样做不起作用,你会怎么做?
答案 0 :(得分:1)
我有一段时间没与EL合作过,所以我猜了一下......
由于ObjectNode
没有实现Map
并且没有为“log”定义属性获取器,因此可能需要采用不同的方法。 (我猜测示例EL仅适用于Map
实例和bean。)
不是将Jackson实现放在您的视图(JSP)中,而是从Jackson结构中的数据填充适当的Java结构(其中没有任何Jackson类)是有意义的,然后只是通过杰克逊的视图 - 免费的Java结构?然后,将Java数据绑定到视图元素会更直接。
由于杰克逊的优势之一通常是很容易从JSON数据中填充Java结构,我认为这种方法相对容易。
答案 1 :(得分:1)
现在我重新审视了这个问题,我为ELResolver和ArrayNode编写了自己的ObjectNode。有用的链接是
编辑:
就ArrayNode而言,它帮助我查看了Tomcat's ArrayELResolver。从那里开始很容易。