2015-10-16 39 views
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> 

在先進的感謝。

+0

你寫道:「記錄器甚至爲空......」這太奇怪了,我認爲還有其他的錯誤(構建過程...)。嘗試使用'private final Logger ...'(帶'final')。然後記錄器必須不爲空。如果它仍然爲空,則在其他位置搜索此問題,但不在框架中搜索。 - 我想到的一件事是AspectJ或'@ PreAuthorize'用於應用其功能的任何其他技術。 – Ralph

+0

嗨,即使添加'final',記錄器在'@ InitBinder'方法中仍然爲空。唯一的解決方案是使其靜態。 – smallufo

+0

這很可能是由於代理。在控制器上使用Spring Security不是一個好習慣。如果您必須限制請求限制網址。這些服務是應該註釋的服務。田間注射也是一種不好的做法。改爲使用構造函數注入。 – zeroflagL

回答

0

最簡單的解決方案是爲myValidator創建一個setter方法。這個設置器會在應用程序初始化時被調用。對所有被@PreAuthorize標記取消的注射劑做這件事。