SpelEvaluationException: EL1007E:(позиция 43): поле или свойство 'группа' не могут быть найдены в нуле
У меня полностью настроена защита SPRING METHOD для моего веб-приложения. (с включенными аннотациями PRE/POST).
Однако недавно я столкнулся со странной проблемой с ними. Резюме следующим образом:
Краткое описание 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 }
Предавторизованный фильтр по методу.
@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>
- Если вы используете 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
,