Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring @预授权控制器在@InitBinder中使@Inject无效_Spring_Spring Mvc_Spring Security_Spring Validator - Fatal编程技术网

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: