2010-03-31 10 views
2

Je dois enregistrer un ELResolver personnalisé pour un projet Google App Engine.GAE/J: impossible d'enregistrer un ELResolver personnalisé

Comme il doit être enregistré avant toute demande reçue, as specified by the Javadoc:

It is illegal to register an ELResolver after the application has received any request from the client. If an attempt is made to register an ELResolver after that time, an IllegalStateException is thrown.

J'utilise un ServletContextListener:

public class RegisterCustomELResolver implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     ServletContext context = sce.getServletContext(); 
     JspApplicationContext jspContext = 
      JspFactory.getDefaultFactory().getJspApplicationContext(context); 
     jspContext.addELResolver(new MyELResolver()); 
    } 

    ... 
} 

Le problème est que JspFactory.getDefaultFactory() retourne toujours nulle. J'ai déjà rempli un rapport de bug. Une idée pour une solution de contournement?

Répondre

4

Je ne suis pas sûr quel servletcontainer GAE utilise "sous les hottes" (Jetty? Tomcat?), Mais cela est reconnaissable comme bug dans Tomcat 6.x. Une solution de contournement est de forcer le chargement de JspRuntimeContext vous avant de l'usine:

Class.forName("org.apache.jasper.compiler.JspRuntimeContext"); 

Voir si ceci ou bidouille similaire aide.

+0

bien! Maintenant, j'obtiens un 'java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext (Ljavax/servlet/ServletContext;) Ljavax/servlet/jsp/JspApplicationContext;' exception. La version JSP est 2.0 où 'getApplicationContext()' est défini pour JSP 2.1. Je n'ai définitivement pas de chance – dfa

+1

'ELResolver' est aussi JSP 2.1. GAE est vraiment JSP 2.0? Je m'attendrais à ce que ce soit JSP 2.1. Est-ce que votre 'web.xml' est déclaré comme Servlet 2.5? Exemple ici: http://snipplr.com/view/3775/minimal-webxml-webapp-descriptor-version-25/ – BalusC

+0

2.5, bien sur :) – dfa