2012-03-28 5 views
1

Wir haben Eigenschaften definiert in mehreren Ressourcenbündel, die in den Flächen-config.xmljavax.el.PropertyNotFoundException Vermeidung Ressourcenbündel für Lookups in JSF 2.1 + Feder 3

<resource-bundle> 
<base-name>webMessages</base-name> 
<var>feBundle</var> 
</resource-bundle> 

Wir versuchen dann Zugriff konfiguriert sind, eine Eigenschaft, die nicht definiert ist.

<tag infoText="#{feBundle['insurance.comparison.household.details.aicraftCrash.tooltip']}" 

/>

Wenn die Eigenschaft nicht verfügbar ist ein javax.el.PropertyNotFoundException geworfen wird und bewirkt, dass die Gesichter Servlet eine leere Seite zu machen. Aus der Dokumentation des ResourceBundleELResolver sollte dies nicht geschehen, da diese Ausnahme nicht ausgelöst wird. Ich kann sehen, dass es Teil der Resolver des DemuxCompositeELResolver ist. Aber es scheint, dass es nie aufgerufen wird. Stattdessen wird der MapELResolver (der hinter dem RBLResolver in der Liste der Resolver steht) aufgerufen und löst eine Exception aus. Ich kann nicht wirklich etwas von diesem Verhalten machen und das Debugging ist langweilig. Es muss einen Weg geben, um dies zu umgehen. Eine fehlende Eigenschaft kann den gesamten Seitenrendering-Prozess nicht unterbrechen. Irgendwelche Ideen?

Hinweis: Dies ist ein Problem nur mit der javax.el Bibliothek als mit tomcat> 6 Distributionen

Antwort

2

Ich untersuchte das Problem ein bisschen weiter und stellte fest, dass es durch die Umsetzung des javax.el Pakets verursacht wird, in die Tomcat-Verteilung. Das beschriebene Verhalten tritt also nur dann auf, wenn Tomcat> 6 verwendet wird. Ich habe bereits einen Bug-Report in ihrem Bug-Tracking-Tool abgelegt, obwohl man argumentieren kann, dass es kein richtiger Bug ist, sondern eine Art gewolltes (aber IMHO, hässliches) Verhalten. Ich habe auch eine Lösung für jsf gefunden.

Unterklasse ResourceBundleELResolver und überschreiben Sie die Methode getValue (...). Ändern Sie den Wert so, dass das PropertyResolved-Attribut auf "true" gesetzt wird, bevor eine Ausnahme auftreten kann.

if (base instanceof ResourceBundle) { 
     if (property != null) { 
      try { 
       context.setPropertyResolved(true); 
       Object result = ((ResourceBundle) base).getObject(property 
         .toString()); 
       return result; 
      } catch (MissingResourceException mre) { 
       System.out.println("Missing property: " + property); 
       return "?" + property.toString() + "?"; 
      } 
     } 
    } 

Register dieser Brauch Resolver in der faces-config.xml mit

<el-resolver>your.package.TheResolverImplementation</el-resolver> 

Und der Link zum Fehlerbericht https://issues.apache.org/bugzilla/show_bug.cgi?id=53001

+0

Thank you! Dieser Beitrag hat meinen Tag gerettet. – anttix

+0

Kühl. Endlich konnte ich jemandem helfen, nachdem ich auf Stackoverflow so viele nützliche Posts genossen hatte. Apropos. Der Fehler ist in der aktuellen Tomcat-Version behoben (der Entwickler war sehr nett und hat das Problem sofort aufgegriffen) – bennidi

Verwandte Themen