2011-06-20 4 views
1

私はSpringを使用していて、Jackson's ObjectNodeのインスタンスであるフィールドdataを含むモデルを返すコントローラを持っているとします。 dataの中にStringBuilderという名前のlogがあります。私はlogにアクセスしたい場合はジャクソンのJsonNodeのJSP式言語

{"log":hello world} 

は今、私は

${data["log"]} 

が、すべてを使用すると考えていた:私は

${data} 

を使用して、私はこの出力を取得するJSPで

私は得る

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によると、そのキーへのアクセスは、この種のdataにする方法getLog()を探しますが、IIRC Maps<?,?>サポートすることを知っています。ジャクソンと同じようにする方法はありますか?または、それがちょうどこのように動作しない場合、どうすればよいでしょうか?

ObjectNodeはおそらく異なる、 Mapを実装していないと、「ログ」のプロパティのゲッターを定義していませんので...

を私はしばらくELで働いていないので、私は少し推測している

答えて

1

この問題を再訪したので、ArrayNodeObjectNodeについては、自分自身でELResolverと書いています。
は限りArrayNodeが懸念しているとして、それはTomcat's ArrayELResolverを見て私を助け:参考リンクは

EDITました。そこから行くのはかなり簡単です。

1

アプローチが必要です。 (私はELを推測していますが、MapのインスタンスとBeanでのみ動作します)

Java実装をビュー(JSP)に入れるのではなく、適切なJava構造をそれをジャクソン構造のデータから取り出し、ジャクソンフリーのJava構造をビューに渡すだけですか?そうすれば、Javaデータをビュー要素にバインドする方がより簡単になります。

ジャクソンの強みの1つは、一般的にJSONデータからJava構造を簡単に取り込むことができるため、このアプローチは比較的簡単だと思います。

+0

私はあなたの意見を見ていますが、十分な議論があり、このシナリオではジャクソンクラスを使用することに決めました。これに対する重要な側面の1つは、外部データソースからデータを取得する方法でした。それは私が回避できないものです。これらの行の間には、私が並べていたものにかなり同意するので、私はこれのために何らかのラッパーをコーディングする必要があると思います。 – sjngm