Java SpelEvaluationException:EL1007E:(位置43):字段或属性';集团';在null上找不到

Java SpelEvaluationException:EL1007E:(位置43):字段或属性';集团';在null上找不到,java,spring,spring-security,spring-el,spelevaluationexception,Java,Spring,Spring Security,Spring El,Spelevaluationexception,我已经为我的web应用程序完全配置了SPRING方法安全性。(启用前/后注释) 但是最近我遇到了一个奇怪的问题。总结如下: POJO概述 // User Class public class User { int id; String name; // getters and setters } // Group Class public class Group { int id; String name; // getters and sett

我已经为我的web应用程序完全配置了SPRING方法安全性。(启用前/后注释)

但是最近我遇到了一个奇怪的问题。总结如下:

  • POJO概述

    // 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)'"
    
    在深入了解例外情况后:

    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
    

    请提供指向相同地址的指针。

    getter/setter似乎很好。。。也没有出现
    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;
    
    我进一步观察到,参数名在first中不匹配(即Service和serviceinpl都有不同的参数名)


    现在,为了保持一致性,这个问题似乎已经得到了解决。

    正如@zeroflagL所问:您是否在编译时没有调试信息?这可能与and的问题相同–检查POM(或Eclipse配置或其他)的调试配置,例如
    maven编译器插件中的
    false
    ,我在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>
    
    
    org.apache.maven.plugins
    了解更多关于这个问题的信息


    希望有帮助

    我也遇到了同样的问题,发现要检查授权的对象的名称在接口和实现中必须相同

    例如,如果您的界面中有此方法:

    @PreAuthorize("hasPermission(#foo, 'UPDATE')")
    public void testMethod(MyObject foo);
    
    在实施过程中,您应该具备以下条件:

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

    我希望这能有所帮助。

    检查setter/getter并确保它们是正确的,
    null
    作为参数传递,或者代码在编译时没有调试信息。仍在处理一个非常类似的问题(但在IntelliJ中)。有趣的观察,在将这个片段粘贴到我的POM中之后,maven成功地运行了我的测试。之后,当我使用IntelliJ运行它们时,它们也会成功,但IntelliJ一旦重建我的代码,它们就会再次崩溃。使用maven编译后,它们再次工作。我开始觉得恶心。。。