Question

différent entre notre WAS dans dev et notre locale était

Notre application utilise Spring-sécurité avec la version Spring 3.1.0-release.

Il commence dans un fichier JSP, nous essayons de montrer le nom d'utilisateur connecté:

On était en DEV, nous avons un NotReadablePropertyException: « Propriété Bean « principale » est pas lisible ou a un getter non valide: Le type de retour du getter correspondre au type de paramètre du setter »

En effet, le AuthenticationTag utilise un BeanWrapper (BeanWrapperImpl)

À la ligne 729 (printemps-3.1.0 RELEASE) du fichier BeanWrapperImpl l'erreur est de lancer,

727:PropertyDescriptor pd = getCachedIntrospectionResults().getPropertyDescriptor(actualName);
728:if (pd == null || pd.getReadMethod() == null) {
729:                throw new NotReadablePropertyException(getRootClass(), this.nestedPath + propertyName);
730:}

pd est nulle ou pd.getReadMethod () est nul. Dans les cas normaux getReadMethod retourner ceci: Méthode Object [publique java.lang.Object org.springframework.security.authentication.UsernamePasswordAuthenticationToken.getPrincipal ()]

mise à jour après le débogage et l'ajout de certains journaux dans la classe, il semble que « pd » est nulle

J'ai écrit ce code en Java pur pour identifier l'erreur

    logger.info(session.getAttribute("SPRING_SECURITY_CONTEXT").getClass().toString());
    final SecurityContextImpl sci = ((SecurityContextImpl) session.getAttribute("SPRING_SECURITY_CONTEXT"));
    logger.info(sci.getAuthentication().getClass().toString());
    final Authentication auth = sci.getAuthentication();
    logger.info(auth.getPrincipal().getClass().toString());
    final User u = (User) auth.getPrincipal();
    logger.info(u.getUsername());
    logger.info(SecurityContextHolder.getContext().getAuthentication().getName());

    logger.info("use beanWrapper :");
    final BeanWrapperImpl wrapper = new BeanWrapperImpl(auth);
    String property = "principal";
    Object result = wrapper.getPropertyValue(property);
    logger.info("property : " + property + " value :[" + result.toString() + "]");
    property = "principal.username";
    result = wrapper.getPropertyValue(property);
    logger.info("property : " + property + " value :[" + result.toString() + "]");

log sur notre était en dev:

[2012-01-12 12:23:19,843] INFO  [WebContainer : 8] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.context.SecurityContextImpl
[2012-01-12 12:23:19,843] INFO  [WebContainer : 8] [c.b.e.e.w.c.IndexController] class org.springframework.security.authentication.UsernamePasswordAuthenticationToken
[2012-01-12 12:23:19,843] INFO  [WebContainer : 8] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.userdetails.User
[2012-01-12 12:23:19,843] INFO  [WebContainer : 8] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-12 12:23:19,843] INFO  [WebContainer : 8] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-12 12:23:19,843] INFO  [WebContainer : 8] [c.b.e.e.w.c.IndexController] use beanWrapper :

<500 error>

journaux sur notre était locale:

[2012-01-13 08:51:10,062] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.context.SecurityContextImpl
[2012-01-13 08:51:10,062] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] class org.springframework.security.authentication.UsernamePasswordAuthenticationToken
[2012-01-13 08:51:10,062] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.userdetails.User
[2012-01-13 08:51:10,062] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-13 08:51:10,073] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-13 08:51:10,073] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] use beanWrapper :
[2012-01-13 08:51:10,095] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] property : principal value :[org.springframework.security.core.userdetails.User@99ac08b4: Username: superadmin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: SuperAdmin]
[2012-01-13 08:51:10,095] INFO  [WebContainer : 4] [c.b.e.e.w.c.IndexController] property : principal.username value :[superadmin]

Notre était en dev est une version complète,

Notre locale WAS est une lumière, version gratuite developpeur

UPDATE

Après le codage d'une solution de contournement pour obtenir le userName plus se produire le problème sur la route, toujours avec le BeenWrapperImpl

org.springframework.beans.NotReadablePropertyException: Invalid property 'codeAndName' of bean class [com.data.model.Country]: Bean property 'codeAndName' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:729)
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721)
    at org.springframework.web.servlet.tags.form.OptionWriter.doRenderFromCollection(OptionWriter.java:216)
    at org.springframework.web.servlet.tags.form.OptionWriter.renderFromCollection(OptionWriter.java:186)
    at org.springframework.web.servlet.tags.form.OptionWriter.writeOptions(OptionWriter.java:139)
    at org.springframework.web.servlet.tags.form.OptionsTag.writeTagContent(OptionsTag.java:169)

UPDATE 2:

problème

est plus isolé: sans depenency à la sécurité du printemps, seulement SpringMVC,

lorsqu'un été en beanWrapper roulés n'a pas setter correspondant au getter, il jette un NotReadablePropertyException que le était en dev.

quand il y a un setter, alors il n'y a pas de problème. en supposant que la classe est une classe UsernamePasswordAuthenticationToken de security.class à ressort.

Était-ce utile?

La solution

une solution trouvée:

Probleme est due à l'introduction de ExtendedBeanInfo inf spring3.1

...

cf: https://github.com/SpringSource/spring- cadre / commit / 2f5085aef1e9ac3655a1b1250b6ceca9d0ca3398 # diff-0

la solution est de prendre la version précédente de CachedIntrospectionResults et le mettre dans le paquet « org.springframework.beans » de sorte qu'il sera écrasé,

mais vous devez être sûr que classpath d'application est de prendre d'abord.

Autres conseils

Je faisais la même question lorsque vous essayez de définir une propriété nichée en utilisant BeanWrapper. La question est que la propriété n'a pas un poseur, même si je ne pensais pas que le poseur était nécessaire. Ajout du setter fixe mon problème. Merci de fournir les mises à jour Benoit! Mon haricot:

public class Bean {
    private InnerBean innerBean = new InnerBean();
    public InnerBean getInnerBean() {
        return this.innerBean;
    }
}

Code Mon BeanWrapper qui a échoué:

BeanWrapper wrapper = new BeanWrapperImpl(new Bean());
wrapper.setPropertyValue("innerBean.property","some value");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top