Frage

Anders zwischen unserem war in dev und unserem lokalen war

Unsere Anwendung verwendet Springsicherheit mit der Frühlingsversion 3.1.0-Release.

Es beginnt in einer JSP -Datei, wir versuchen, den vernetzten Benutzernamen anzuzeigen:

On war in dev, wir haben eine nicht readablePropertyException: "Bean -Eigenschaft 'Principal' ist nicht lesbar oder hat eine ungültige Getter -Methode: Stimmt der Rückgabetyp des Getter mit dem Parametertyp des Setters überein?"

Dies liegt daran, dass der AuthenticationTag einen Beanwrapper verwendet (Beanwrapperimpl)

In Zeile 729 (Frühjahr 3.1.0-Release) von Datei-Beanwrapperimpl wird der Fehler geworfen.

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

PD ist also null oder pd.getReadMethod () null. In normalen Fällen gibt GetReadMethod zurück: Objektmethode [public java.lang.object org.springframework.security.authentication.usernamepasswordAuthenticationToken.getprincipal ()]

aktualisierenNach dem Debuggen und Hinzufügen einiger Protokolle in der Klasse scheint es, dass "PD" null ist

Ich habe diesen Code in reinem Java geschrieben, um den Fehler zu identifizieren

    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() + "]");

Anmelden auf unserem war in 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 Fehler>

Protokolle auf unserem Einheimischen waren:

[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]

Unsere war in Dev eine Vollversion,

Unser Einheimischer war eine leichte, kostenlose Entwicklungsversion

AKTUALISIEREN

Nach dem Codieren einer Problemumgehung, um den Benutzernamen zu erhalten

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)

AKTUALISIEREN 2 :

Das Problem ist isolierter: ohne Abhängigkeit von der Frühlingssicherheit, nur SpringMVC,

Wenn ein in Beanwrapper eingestellter Setter nicht dem Getter entspricht, wirft er eine nicht readablePropertyException nur auf das in Dev.

Wenn es einen Setter gibt, gibt es kein Problem. Unter der Annahme, dass die Klasse usernamepasswordAuthenticationToken eine Klasse von Spring Security.Class ist.

War es hilfreich?

Lösung

Eine Lösung gefunden:

Problem ist auf die Einführung von ExtendedBeanInfo inf Spring3.1 zurückzuführen

...

vgl.: https://github.com/springource/spring-framework/commit/2f5085aef1e9ac3655a1b1250b6ceca9d0ca3398#diff-0

Die Lösung besteht also darin, die vorherige Version von CachedIntrospectionResults zu nehmen und in das Paket "org.springframework.beans" zu stecken, damit sie überschrieben wird.

Aber Sie müssen sicher sein, dass der Anwendungsklassenpath zuerst eingenommen wird.

Andere Tipps

Ich hatte das gleiche Problem, als ich versuchte, eine verschachtelte Eigenschaft mit Beanwrapper festzulegen. Das Problem war, dass die Immobilie keinen Setter hatte, obwohl ich nicht der Meinung war, dass der Setter notwendig war. Das Hinzufügen des Setters hat mein Problem behoben. Vielen Dank, dass Sie die Updates Benoit bereitgestellt haben! Meine Bohne:

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

Mein Beanwrapper -Code, der fehlschlug:

BeanWrapper wrapper = new BeanWrapperImpl(new Bean());
wrapper.setPropertyValue("innerBean.property","some value");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top