1
無效@Inject在一個簡單的控制器:@PreAuthorize控制器在@InitBinder
@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>
在先進的感謝。
你寫道:「記錄器甚至爲空......」這太奇怪了,我認爲還有其他的錯誤(構建過程...)。嘗試使用'private final Logger ...'(帶'final')。然後記錄器必須不爲空。如果它仍然爲空,則在其他位置搜索此問題,但不在框架中搜索。 - 我想到的一件事是AspectJ或'@ PreAuthorize'用於應用其功能的任何其他技術。 – Ralph
嗨,即使添加'final',記錄器在'@ InitBinder'方法中仍然爲空。唯一的解決方案是使其靜態。 – smallufo
這很可能是由於代理。在控制器上使用Spring Security不是一個好習慣。如果您必須限制請求限制網址。這些服務是應該註釋的服務。田間注射也是一種不好的做法。改爲使用構造函數注入。 – zeroflagL