Jackson的JsonNode上的JSP表达语言

时间:2011-06-20 10:50:40

标签: jsp el jackson

假设我正在使用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.loggetLog()上查找方法data,但IIRC Maps<?,?>支持对其密钥的这种访问。有没有类似的方法让它与杰克逊合作?或者,如果这样做不起作用,你会怎么做?

2 个答案:

答案 0 :(得分:1)

我有一段时间没与EL合作过,所以我猜了一下......

由于ObjectNode没有实现Map并且没有为“log”定义属性获取器,因此可能需要采用不同的方法。 (我猜测示例EL仅适用于Map实例和bean。)

不是将Jackson实现放在您的视图(JSP)中,而是从Jackson结构中的数据填充适当的Java结构(其中没有任何Jackson类)是有意义的,然后只是通过杰克逊的视图 - 免费的Java结构?然后,将Java数据绑定到视图元素会更直接。

由于杰克逊的优势之一通常是很容易从JSON数据中填充Java结构,我认为这种方法相对容易。

答案 1 :(得分:1)

现在我重新审视了这个问题,我为ELResolverArrayNode编写了自己的ObjectNode。有用的链接是

编辑:
就ArrayNode而言,它帮助我查看了Tomcat's ArrayELResolver。从那里开始很容易。