Spring流程中的空上下文

时间:2015-02-04 08:41:28

标签: spring

我正在尝试在Shibboleth IdP 3.0中自定义登录过程。它基本上是一个Spring Web应用程序,其中包括使用Spring流程。

我收到以下异常(null context):

org.springframework.expression.spel.SpelEvaluationException: EL1011E:(pos 23): Method call: Attempted to call method verify(java.lang.String) on null context object
    at org.springframework.expression.spel.ast.MethodReference.throwIfNotNullSafe(MethodReference.java:144)

它发生在下面的评估表达式中,在这个Spring Web流程中:

<action-state id="VerifyOtp">
    <set name="flowScope.enteredOtp" value="requestParameters.j_otp"
         type="java.lang.String" />
    <set name="flowScope.otpSecretKey" 
        value="keyManager.findSecretKey(flowScope.otpUsername)" 
         type="ch.eifr.oshi.jaas.totp.SecretKey" />

    <evaluate expression="flowScope.otpSecretKey.verify(flowScope.enteredOtp)" 
                  result="flowScope.otpIsValid" />

    <transition on="#{  flowScope.otpIsValid }" to="proceed" />
    <transition on="#{ !flowScope.otpIsValid }" to="DisplayOtpPage" />
</action-state>

流程导入以下bean:

keyManager按预期实例化)

<bean class="ch.eifr.oshi.jaas.totp.SecretKeysManagerImpl" id="keyManager" scope="singleton" />
<bean class="ch.eifr.oshi.jaas.totp.SecretKey" scope="prototype" />

我尝试使用和不使用最后一行,它没有任何区别。我想也许我必须告诉Spring它需要加载的类。情况似乎并非如此。

我认为我的问题与范围或依赖关系有关,因为我尝试在视图中调用keyManager.toString()并返回了一些内容。

但是如果我调用keyManager.findSecretKey('john.doe').getId(),我会得到一个空的上下文异常。请注意,findSecretKey(String)方法始终返回一个新密钥,它永远不会返回null

1 个答案:

答案 0 :(得分:0)

我希望以更好的方式做到这一点,但只有这样才有效:

<action-state id="ExtractOtpFromFormRequestAndValidate">
    <set name="flashScope.enteredOtp" value="requestParameters.j_otp" type="java.lang.String"/>
    <transition on="#{ keyManager.findSecretKey(flowScope.otpUsername).verify(flashScope.enteredOtp) }" to="proceed" />
    <transition to="DisplayOtpPage" />
</action-state>