2015-10-16 3 views
1

В простом контроллере:@PreAuthorize контроллер аннулирует @Inject в @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

Вы писали: «регистратор равно null» ... это настолько странно, что я верю, что что-то происходит неправильно (процесс сборки ...). Попробуйте использовать 'private final Logger ...' (с' final'). Тогда регистратор должен быть не нулевым. Если он по-прежнему равен нулю, выполните поиск этой проблемы где-то в другом месте, но не в рамках. - Одна вещь, которая пришла мне в голову, - это AspectJ или любая другая техника, используемая '@ PreAuthorize' для применения ее функциональности. – Ralph

+0

Привет, даже добавьте 'final', регистратор по-прежнему равен null в методе' @ InitBinder'. Единственное решение - сделать его статичным. – smallufo

+0

Скорее всего, это связано с проксированием. Использование Spring Security на контроллерах не является хорошей практикой. Если вам нужно ограничивать запросы, ограничивайте URL. Эти услуги должны быть аннотированы. Полевая инъекция также является плохой практикой. Вместо этого используйте инъекцию конструктора. – zeroflagL

ответ

0

Самым простым решением было создание метода сеттера для myValidator. этот сеттер затем вызывается, когда приложение инициализируется. Сделайте это для всех инъекций, которые сбрасываются тегами @PreAuthorize.

Смежные вопросы