1

在一个简单的控制器中:

@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

1 回答 1

0

最简单的解决方案是为myValidator. 然后在应用程序初始化时调用此设置器。对所有被@PreAuthorize 标签无效的注射剂执行此操作。

于 2017-03-30T16:06:47.733 回答