В простом контроллере:@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>
Благодаря передовой.
Вы писали: «регистратор равно null» ... это настолько странно, что я верю, что что-то происходит неправильно (процесс сборки ...). Попробуйте использовать 'private final Logger ...' (с' final'). Тогда регистратор должен быть не нулевым. Если он по-прежнему равен нулю, выполните поиск этой проблемы где-то в другом месте, но не в рамках. - Одна вещь, которая пришла мне в голову, - это AspectJ или любая другая техника, используемая '@ PreAuthorize' для применения ее функциональности. – Ralph
Привет, даже добавьте 'final', регистратор по-прежнему равен null в методе' @ InitBinder'. Единственное решение - сделать его статичным. – smallufo
Скорее всего, это связано с проксированием. Использование Spring Security на контроллерах не является хорошей практикой. Если вам нужно ограничивать запросы, ограничивайте URL. Эти услуги должны быть аннотированы. Полевая инъекция также является плохой практикой. Вместо этого используйте инъекцию конструктора. – zeroflagL