在一个简单的控制器中:
@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>
先谢谢。
答案 0 :(得分:0)
最简单的解决方案是为myValidator
创建一个setter方法。然后在应用初始化时调用此setter。对所有被@PreAuthorize标记无效的注射剂执行此操作。