Вопрос

Отличается между нашими были в Дев, и наш местный

Наше приложение использует Spring-Security с Spring версией 3.1.0.

Он начинается в файле JSP, мы пытаемся показать подключенное имя пользователя:

В Dev у нас есть неверно читаемое propertyexception: «Свойство бобов» принципала «не читается или имеет недопустимый метод получения: соответствует ли тип возврата геттера типу параметра сеттера?»

Это потому, что AuthenticationTag использует BeanWrapper (Beanwrapperimpl)

В строке 729 (весна 3.1.0.0) файла beanwrapperimpl Ошибка бросает,

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

Таким образом, PD является NULL или Pd.GetReadMethod () NULL. В обычных случаях getReadMethod возвращает это: объект метод [public java.lang.object org.springframework.security.authentication.usernamepasswordAuthenticationToken.getPrincipal ()

ОбновитьПосле отладки и добавления некоторых журналов в классе, кажется, что «PD» является нулевым

Я написал этот код в Pure Java, чтобы определить ошибку

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

Войдите, наши были в разработке:

[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 ошибка>

Журналы на нашем местном уровне были:

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

Наш был в Dev - полная версия,

Наш местный житель - легкая, бесплатная версия разработчика

ОБНОВИТЬ

После кодирования обходного пути, чтобы получить имя пользователя, проблема происходит дальше в будущем, все еще с Bewrapperimpl

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)

ОБНОВИТЬ 2 :

Проблема более изолирована: без какого -либо зависимости к безопасности весны, только Springmvc,

Когда был поставлен в BeanWrapper, не имеет сеттера, соответствующего Getter, он бросает неверно читаемое пропертиэкспений только в Dev.

Когда есть сеттер, тогда нет проблем. Предполагая, что класс usernamepasswordAuthenticationToken - это класс из Spring Security.class.

Это было полезно?

Решение

одно решение найдено:

Проблема связана с введением ExtendendedBeaninfo Inf Spring3.1

...

CF: https://github.com/springsource/spring-framework/commit/2f5085aef1e9ac3655a1b1250b6ceca9d0ca3398#diff-0

Таким образом, решение состоит в том, чтобы взять предыдущую версию CachedIntrospectionResults и поместить его в пакет "org.springframework.beans", чтобы оно было перезаписано,

Но вы должны быть уверены, что приложение ClassPath займет первым.

Другие советы

У меня была та же проблема, когда я пытался установить вложенную собственность с помощью BeanWrapper. Проблема заключалась в том, что у собственности не было сеттера, хотя я не думал, что сеттер был необходим. Добавление сеттера исправил мою проблему. Спасибо за предоставление обновлений Benoit! Мой боб:

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

Мой код BeanWrapper, который не удался:

BeanWrapper wrapper = new BeanWrapperImpl(new Bean());
wrapper.setPropertyValue("innerBean.property","some value");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top