在@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在应用启动时验证这些表达式是否有效?
答案 0 :(得分:0)
saveX
进行验证。我还要说一下,如果您想拥有质量良好的可测试代码,请尝试尽快摆脱SpringEL。以我的经验,这种方法被证明可测试性差,难以维护,并且还会给源代码带来不必要的复杂性。
在现代spring框架中,有很多方法可以避免编写SpringEl。
答案 1 :(得分:0)
Spring总是在启动时验证所有bean。但是您的问题不在验证范围之内,您的问题是测试问题。预授权过程是运行时作业。 Spring不知道如何处理此表达式。spring只是根据SPEL规则检查其语法。