Язык выражений JSP на JsonNode Джексона - PullRequest
1 голос
/ 20 июня 2011

Допустим, я использую Spring и имею контроллер, который возвращает модель, содержащую поле data, которое является экземпляром Джексона ObjectNode. В data у меня есть StringBuilder с именем log.

В 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<?,?> поддерживает этот вид доступа к своим ключам. Есть ли подобный способ заставить его работать с Джексоном? Или, если это просто не работает, как бы вы это сделали?

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Теперь, когда я вернулся к этой проблеме, я написал свой собственный ELResolver для ArrayNode и ObjectNode .Полезные ссылки:

РЕДАКТИРОВАТЬ:
Что касается ArrayNode, он помог мне взглянуть на Tomcat ArrayELResolver .Оттуда довольно легко идти.

1 голос
/ 22 июня 2011

Я давно не работал с EL, поэтому, наверное, немного ...

Поскольку ObjectNode не реализует Map и не определяет метод получения свойства для "log", возможно, необходим другой подход. (Я предполагаю, что пример EL работает только на Map экземплярах и бинах.)

Вместо представления реализаций Джексона в вашем представлении (JSP), имеет ли смысл заполнять соответствующую структуру Java (без каких-либо классов Джексона в ней) из данных в структуре Джексона, а затем просто передавать представление Джексона структура Java? Тогда связывание данных Java для просмотра элементов будет более простым.

Поскольку одна из сильных сторон Джексона, как правило, заключается в том, что он очень легко заполняет структуры Java из данных JSON, я думаю, что этот подход будет относительно простым.

...