2011-06-20 1 views
1

Supposons que j'utilise Spring et qu'un contrôleur renvoie un modèle contenant un champ data qui est une instance de Jackson's ObjectNode. Dans data j'ai un StringBuilder nommé log.Langage d'expression JSP sur JSONNode de Jackson

Dans la JSP j'utilise

${data} 

et je reçois cette sortie:

{"log":hello world} 

Maintenant, si je veux accéder log je pensais que je pouvais utiliser

${data["log"]} 

mais tous Je reçois est

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} montre la même chose.

Je sais que, selon l'EL data.log cherche une méthode getLog() sur data, mais IIRC Maps<?,?> soutenir ce genre d'accès à ses clés. Y a-t-il un moyen similaire de le faire fonctionner avec Jackson? Ou si cela ne fonctionne pas de cette façon, comment feriez-vous cela?

Répondre

1

Maintenant que je revisité cette question, je l'ai écrit mon propre ELResolver pour ArrayNode et ObjectNode. Liens utiles ont été

EDIT:
En ce qui concerne le ArrayNode est concerné, il m'a aidé à regarder Tomcat's ArrayELResolver. C'est assez facile d'aller de là.

1

Je n'ai pas travaillé avec EL dans un certain temps, donc je devine un peu ...

Depuis ObjectNode n'implémente pas Map et ne définit pas un getter de propriété pour « log », peut-être un autre approche est nécessaire. (Je suppose que l'exemple EL ne fonctionne que sur Map instances et beans.)

Au lieu de mettre les implémentations Jackson dans votre vue (la JSP), est-il sensé de remplir une structure Java appropriée (sans classes Jackson dans il) à partir des données dans la structure de Jackson, puis passez juste la vue de la structure Java Jackson-libre? Ensuite, la liaison des données Java pour afficher les éléments serait plus simple.

Étant donné que l'une des forces de Jackson rend généralement très facile le remplissage de structures Java à partir de données JSON, je pense que cette approche serait relativement facile.

+0

Je vois ce que vous voulez dire, mais il y a eu beaucoup de discussions et il a été décidé d'utiliser des classes Jackson dans ce scénario. L'un des aspects clés de ce problème était la manière dont nous récupérions les données à partir d'une source de données externe. Donc c'est quelque chose que je ne peux pas contourner. Entre les lignes, vous êtes plutôt d'accord avec ce que j'ai mis en ligne, donc je suppose que je devrais coder une sorte de wrapper pour cela. – sjngm

Questions connexes