web-dev-qa-db-ja.com

SpelEvaluationException:EL1007E:(pos 43):フィールドまたはプロパティ 'group'がnullで見つかりません

Webアプリケーション用にSPRINGMETHODセキュリティを完全に構成しています。 (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

同じことに対処するためのポインタを提供してください。

8
hemantvsn

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の両方でパラメーター名が異なっていました)。

現在、均一性を維持しているため、問題は修正されているようです。

5
hemantvsn

SpringBootアプリケーションでも同じ問題が発生しました。上記のコメントに記載されているように、デバッグシンボル情報なしでコンパイルしていたことが判明しました。私は2つの方法で問題を修正できることに注意したいと思います。

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コンパイル-> [メソッドパラメータに関する情報を保存する]をオンにします(リフレクション経由で使用可能)」。

私は本当に面白いと思いました このリンク この問題についてもっと知るために。

それが役に立てば幸い!

2
alonso_50

@zeroflagLが尋ねたように:デバッグ情報なしでコンパイルしていますか?これはおそらく Spring @Cacheable with Ehcache、spel find null for valid object および Spring @Cacheable with SpEL key:常にnullと評価されます – POMを確認してください(またはEclipse構成など)デバッグ構成用(例:<debug>false</debug> の中に maven-compiler-plugin

0
Michael Piefel