Spring @预授权控制器在@InitBinder中使@Inject无效
在简单控制器中:Spring @预授权控制器在@InitBinder中使@Inject无效,spring,spring-mvc,spring-security,spring-validator,Spring,Spring Mvc,Spring Security,Spring Validator,在简单控制器中: @PreAuthorize("hasAuthority('USER')") @Controller @RequestMapping("/test") public class TestController { private Logger logger = LoggerFactory.getLogger(getClass()); @Inject private MyValidator myValidator; @InitBinder("myObj")
@PreAuthorize("hasAuthority('USER')")
@Controller
@RequestMapping("/test")
public class TestController {
private Logger logger = LoggerFactory.getLogger(getClass());
@Inject
private MyValidator myValidator;
@InitBinder("myObj")
private void initBinder(WebDataBinder binder) {
logger.info("myValidator = {}", myValidator);
binder.initDirectFieldAccess();
binder.setValidator(myValidator);
}
@RequestMapping(value = "/doPost", method = RequestMethod.POST)
public String doPost(MyObj myObj , BindingResult br ) throws IOException {
logger.info("myObj = {} , bindingResult = {}" , myObj , br);
return "redirect:/test/form";
}
}
我注意到注入的验证器在initBinder
方法中总是空的,记录器甚至是空的(并抛出NPE),这很奇怪
如果我完全删除了@InitBinder InitBinder()
方法,那么myValidator
在每个方法中都是可用的(不是空的)
在排除了许多因素后,我发现罪魁祸首是@PreAuthorize(“hasAuthority('USER')”)
。删除此@PreAuthorize
后,一切正常
是虫子吗?是否与SpringSecurity、SpringValidation和SpringMVC存在冲突
如何修复它
环境:
<spring.version>4.2.1.RELEASE</spring.version>
<springboot.version>1.3.0.M5</springboot.version>
<spring-security.version>4.0.2.RELEASE</spring-security.version>
4.2.1.1版本
1.3.0.M5
4.0.2.1发布
感谢advanced。最简单的解决方案是为
myValidator
创建一个setter方法。然后在应用程序初始化时调用此setter。对所有被@PreAuthorize标记置空的注射剂执行此操作。最简单的解决方案是为myValidator
创建一个setter方法。然后在应用程序初始化时调用此setter。对所有被@PreAuthorize标签置空的注射剂执行此操作。您写道:“记录器甚至为空”。。。这太奇怪了,我相信还有其他一些地方出了问题(构建过程…)。尝试使用private final Logger…
(使用final
)。那么记录器必须不为null。如果仍然为空,则在其他地方搜索此问题,但不要在框架中搜索。-我想到的一件事是AspectJ或任何其他由@PreAuthorize
用于应用其功能的技术。嗨,即使添加final
,记录器在@InitBinder
方法中仍然为空。唯一的解决方案是使其静态。这很可能是由于代理。在控制器上使用Spring安全性不是一个好的做法。如果必须限制请求,请限制URL。这些服务应该被注释。现场注入也是一种糟糕的做法。改用构造函数注入。@zeroflagL不管它是好的还是坏的实践(不允许与stack Overfow问题讨论),它都应该可以工作。您好,在向Spring的JIRA报告后,Spring的团队似乎将其视为一个bug:您写道:“记录器甚至是空的”。。。这太奇怪了,我相信还有其他一些地方出了问题(构建过程…)。尝试使用private final Logger…
(使用final
)。那么记录器必须不为null。如果仍然为空,则在其他地方搜索此问题,但不要在框架中搜索。-我想到的一件事是AspectJ或任何其他由@PreAuthorize
用于应用其功能的技术。嗨,即使添加final
,记录器在@InitBinder
方法中仍然为空。唯一的解决方案是使其静态。这很可能是由于代理。在控制器上使用Spring安全性不是一个好的做法。如果必须限制请求,请限制URL。这些服务应该被注释。现场注入也是一种糟糕的做法。改用构造函数注入。@zeroflagL不管它是好的还是坏的实践(不允许与stack Overfow问题讨论),它都应该有效。您好,在向Spring的JIRA报告后,Spring的团队似乎将其视为一个bug: