SpelEvaluationException:EL1007E:(pos 43):在null上找不到字段或属性“group”

时间:2014-04-09 10:15:20

标签: java spring spring-security spring-el spelevaluationexception

我为我的Web应用程序完全配置了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. PreAuthorise过滤方法。

    @PreAuthorize("canIEditGroupProfile(#membership.group.id)")
    public int updateGroupMembership(GroupMembership membership)
        throws GroupsServiceException;
    
  3. 传递完全填充的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
    

    请提供相同的指示。

4 个答案:

答案 0 :(得分:4)

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都有不同的参数名称)。

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

答案 1 :(得分:1)

我在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,请转到项目属性 - &gt; Java编译 - &gt;检查&#34;存储有关方法参数的信息(可通过反射使用)&#34;。
  2. 我发现真的很有意思this link来了解这个问题。

    希望它有所帮助!

答案 2 :(得分:0)

正如@zeroflagL问:你在没有调试信息的情况下进行编译吗?这可能与spring @Cacheable with Ehcache, spel find null for valid objectSpring @Cacheable with SpEL key: always evaluates to null相同 - 检查您的POM(或Eclipse配置或其他)以获取调试配置,例如<debug>false</debug>中的maven-compiler-plugin。 / p>

答案 3 :(得分:0)

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

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

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

您应在实现中添加以下内容:

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

我希望这会有所帮助。