2011-06-20 48 views
1

假設我正在使用Spring並且有一個控制器返回一個包含字段data的模型,該字段是Jackson's ObjectNode的一個實例。在data我有一個StringBuilder名爲logJackson的JsonNode上的JSP表達式語言

在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<?,?>支持這種訪問其鍵。是否有任何類似的方式使它與傑克遜合作?或者如果這種方式不起作用,你會如何做到這一點?

回答

1

我還沒有在一段時間與EL的工作,所以我猜有點...

由於ObjectNode沒有實現Map和「日誌」,也許是不同的沒有定義屬性的getter方法是必要的。 (我猜這個例子EL僅適用於Map實例和bean。)

而不是將傑克遜實現放入您的視圖(JSP)中,是否有意義填充適當的Java結構(沒有任何Jackson類它)來自Jackson結構中的數據,然後只是將這個視圖傳遞給傑克遜免費的Java結構?然後,將Java數據綁定到視圖元素將更直接。

由於傑克遜的強項之一通常使得從JSON數據填充Java結構變得非常容易,所以我認爲這種方法相對容易。

+0

我明白了你的觀點,但是已經有很多討論,並且決定我們將在該場景中使用Jackson類。其中一個關鍵方面是我們如何從外部數據源檢索數據。所以這是我無法解決的問題。在行之間,你幾乎同意我所列出的內容,所以我想我將不得不爲此編寫某種包裝。 – sjngm