2010-06-19 6 views
1

J'utilise jsf1.2 XHTML comme suit:JSF backing bean ne peut pas accéder à la méthode de remplacement de la classe imbriquée

<h:commandLink label="Open" action="#{surveySubFmTreeViListWeb.dtw.updatePage}"> 

alors le backing bean ressemble:

public class SurveySubFmTreeViListWeb 
    { 
    ..... 
     private DataTableWeb<Entity> dtw = new DataTableWeb<Entity>(Entity.class) { 
       @Override 
       public void updatePage() throws Exception 
       {...snip...} 
     }; 
    } 

si je remplace la méthode publique de Class DataTableWeb qui est la classe imbriquée de bean de support. Je vais obtenir les exceptions suivantes:

java.lang.IllegalAccessException: Class org.apache.el.parser.AstValue can not access a member of class com.ss.survey.web.SurveySubFmTreeViListWeb $1 with modifiers "public" 

cependant, si la méthode d'accès public ne soit prioritaire dans le backing bean, cela fonctionnera bien.

Quelqu'un peut-il m'aider à le comprendre? Toute aide est appréciée.

+0

Connexe: http://stackoverflow.com/questions/2998745/how-to-invoke-jsf-action- sur-une-classe-anonyme-el-ne-pas-acceder-it – BalusC

Répondre

1

C'est un problème général avec la réflexion. Son contrôle d'accès ne permet qu'un sous-ensemble de ce que la langue elle-même permet. Fondamentalement, pour que la réflexion fonctionne, vous devez rendre tout public.

Dans votre cas, vous devez faire une dtw initialiseur non anonyme public class, un peu comme ceci:

private DataTableWeb<Entity> dtw = new CustomDataTableWeb(); 

public static class CustomDataTableWeb extends DataTableWeb <Entity> 
{ 
    @Override 
    public void updatePage() throws Exception 
    {...snip...} 
}; 

Si vous avez besoin d'un accès à this extérieur, ne pas oublier d'enlever static de définition de classe.

+0

Salut, doublep. Merci beaucoup. Mais j'étais encore confus à savoir pourquoi l'utilisation de la méthode originale updatePage() dans Class DataTableWeb peut fonctionner ok. – user371004

+0

@ mark-zhu: Parce que (je suppose) il est défini dans une classe publique. La réflexion est différente de l'accès normal dans la mesure où elle prend également en compte la restriction d'accès de la classe. Par exemple. pour un accès normal "private class mais public method" est OK: tant que vous avez une référence à un objet, cela n'a pas d'importance si vous avez accès à sa classe actuelle. Mais pour la réflexion cela ne marchera pas, vous avez besoin que la classe soit aussi publique. – doublep

0

encore merci. puis-je prendre comme suite

what's happening behind the scenes: 
action="#{surveySubFmTreeViListWeb.dtw.updatePage}" 

public static void main(String[] args) throws Exception { 
Object dtw = SurveySubFmTreeViListWeb.getClass().getDeclaredMethod("getDtw", null).invoke(surveySubFmTreeViListWeb, null); 
Object action = dtw .getClass().getDeclaredMethod("updatePage",null).invoke(dtw , 0); 

}

parce que je porte la référence à l'objet DTW, de sorte que la réflexion peut accéder à la méthode publique de DTW. mais si je remplace une méthode publique dans la classe surveySubFmTreeViListWeb, la réflexion ne fonctionnera pas en raison d'un accès restreint

+0

n'ajoutez pas de réponses, mais modifiez votre question initiale –

+0

Merci u doublep. Je répare le problème .u r un homme bon. – user371004

Questions connexes