SpelEvaluationException: EL1007E:(позиция 43): поле или свойство 'группа' не могут быть найдены в нуле

У меня полностью настроена защита SPRING METHOD для моего веб-приложения. (с включенными аннотациями PRE/POST).

Однако недавно я столкнулся со странной проблемой с ними. Резюме следующим образом:

  1. Краткое описание POJOS

    // User Class
    public class User {
        int id;
        String name;
        // getters and setters
    }
    
    // Group Class
    public class Group {
        int id;
        String name;
        // getters and setters
    }
    
    // GroupMembership class
    public class GroupMembership {
        private int id;
        private User user;
        private Group group;
        // getters and setters
    }
    
  2. Предавторизованный фильтр по методу.

    @PreAuthorize("canIEditGroupProfile(#membership.group.id)")
    public int updateGroupMembership(GroupMembership membership)
        throws GroupsServiceException;
    

Проехав полностью заселенный GroupMembership объект (присутствуют правильные композиции пользователей и групп), фильтр безопасности выдает следующее исключение:

errorMessage: "Failed to evaluate expression
    canIEditGroupProfile(#membership.group.id)'"

При копании в исключении:

Причина найдена, чтобы быть:

org.springframework.expression.spel.SpelEvaluationException:
    EL1007E:(pos 33): Field or property 'group' cannot be found on null

Пожалуйста, предоставьте указатели для того же адреса.

3 ответа

getter/setters, кажется, хорошо... тоже нет null,

Однако интересное наблюдение; этот дает мне ошибку:

@PreAuthorize("canIEditGroupProfile(#membership.group.id)")
public int updateGroupMembership(GroupMembership membership)
    throws GroupsServiceException; 

Это отлично работает:

@PreAuthorize("canIEditGroupProfile(#groupmembership.group.id)")
public int updateGroupMembership(GroupMembership groupmembership)
    throws GroupsServiceException;

Далее я заметил, что имя параметра не совпадало в случае первого (т.е. Service и ServiceImpl оба имели разные имена параметров).

Теперь, сохраняя единообразие, проблема, кажется, исправлена.

Я получил ту же проблему в моем приложении Spring Boot. Оказалось, что я компилировал без информации об отладочных символах, как это упоминалось в комментарии выше. Я хотел бы отметить, что я мог бы решить проблему двумя способами:

1. (Мой любимый): просто включите это в свои pom.xml -> плагины

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
       <compilerArgument>-parameters</compilerArgument>
       <testCompilerArgument>-parameters</testCompilerArgument>
    </configuration>
</plugin>
  1. Если вы используете Java 1.8 и Eclipse в качестве IDE, перейдите в Свойства вашего проекта -> Компиляция Java -> установите флажок "Хранить информацию о параметрах метода (можно использовать через отражение)".

Я нашел действительно интересной эту ссылку, чтобы узнать больше о проблеме.

Надеюсь, поможет!

У меня была такая же проблема, и я обнаружил, что имя объекта для проверки авторизации должно совпадать в интерфейсе и реализации.

Например, если у вас есть этот метод в вашем интерфейсе:

@PreAuthorize("hasPermission(#foo, 'UPDATE')")
public void testMethod(MyObject foo);

в реализации должно быть следующее:

public void testMethod(MyObject foo) { ... your code here... }

Надеюсь, это поможет.

Как @zeroflagL спросил: вы компилируете без отладочной информации? Вероятно, это та же проблема, что и у Spring @Cacheable с Ehcache, spel find null для допустимого объекта и Spring @Cacheable с ключом SpEL: всегда оценивается как ноль - проверьте вашу POM (или конфигурацию Eclipse или что-то еще) для вашей конфигурации отладки, например <debug>false</debug> в maven-compiler-plugin,

Другие вопросы по тегам