有什么方法可以强制Spring在应用启动时检查EL表达式?

时间:2019-05-14 12:46:10

标签: spring el spring-el

@RestController中,我有一些与此类似的端点:

@RestController
@RequestMapping("/rest/x")
public class XApiController
{

    // ...

    @PostMapping(...)
    @PreAuthorize("@apiAuthService.canAccessX(#headers)")
    public void saveX(...)
    {
        // ...
    }
}

这些端点要求开发人员使HttpHeaders对象可用并在方法声明中正确命名它:

public void saveX(@RequestHeader HttpHeaders headers)

我们的问题是,如果没有完成最后一步,则端点仅在调用端点时在运行时失败。这意味着以后很难从大型重构中发现问题(例如,将HttpHeaders参数更改为HttpServletRequest)。有什么方法可以告诉Spring在应用启动时验证这些表达式是否有效?

2 个答案:

答案 0 :(得分:0)

  • 我建议您创建集成测试,然后在部署应用程序之前从集成测试中调用saveX进行验证。

我还要说一下,如果您想拥有质量良好的可测试代码,请尝试尽快摆脱​​SpringEL。以我的经验,这种方法被证明可测试性差,难以维护,并且还会给源代码带来不必要的复杂性。

在现代spring框架中,有很多方法可以避免编写SpringEl。

答案 1 :(得分:0)

Spring总是在启动时验证所有bean。但是您的问题不在验证范围之内,您的问题是测试问题。预授权过程是运行时作业。 Spring不知道如何处理此表达式。spring只是根据SPEL规则检查其语法。

  1. 您可以创建测试来检查标题。
  2. 您可以将您的IDE弹簧检查级别提高到错误水平。
  3. 您可以简单地编写一个静态方法来获取标头,而无需使用rest参数。