Spring @如果我使用@PreAuthorize方法级别的安全性,则不会调用Valid

Spring @如果我使用@PreAuthorize方法级别的安全性,则不会调用Valid,spring,spring-mvc,spring-boot,spring-security,Spring,Spring Mvc,Spring Boot,Spring Security,以下是来自我的控制器的代码片段: @RestController @RequestMapping(Constants.REST_CONTROLLER_ENDPOINT) class ProductRestController { private final ProductValidator productValidator; @InitBinder private void initBinder(WebDataBinder binder) { binder.setValidator(p

以下是来自我的控制器的代码片段:

@RestController
@RequestMapping(Constants.REST_CONTROLLER_ENDPOINT)
class ProductRestController {

private final ProductValidator productValidator;
@InitBinder
private void initBinder(WebDataBinder binder) {
    binder.setValidator(productValidator);
}

private Product createProductFromJson(Product input) {
    ...
    return product;
}

@PasswordFilter
@RequestMapping(consumes = { Constants.HAL_CONTENT_TYPE,
       Constants.JSON_CONTENT_TYPE }, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public ResponseEntity<Product> createProduct(@RequestBody @Validated Product input) {
    Product product = createProductFromJson(input);
    Product savedProduct = productRepository.save(product);
    return new ResponseEntity<>(product, responseHeaders, HttpStatus.CREATED);
}

@PasswordFilter
@PreAuthorize("@productRestController.validatePermission(authentication, #product)")
@RequestMapping(value = "/{id}", consumes = { Constants.JSON_CONTENT_TYPE }, method = {
        RequestMethod.PUT })
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<Product> updateProduct(Principal principal, @PathVariable Long id,
        @RequestBody @Validated Product product) {
       ...
    return new ResponseEntity<>(updatedProduct, HttpStatus.OK);
}
@RestController
@RequestMapping(常量.REST\u控制器\u端点)
类ProductRestController{
私人最终产品验证器产品验证器;
@InitBinder
专用绑定器(WebDataBinder绑定器){
binder.setValidator(productValidator);
}
私有产品createProductFromJson(产品输入){
...
退货产品;
}
@密码过滤器
@RequestMapping(使用={Constants.HAL_CONTENT_TYPE,
Constants.JSON_CONTENT_TYPE},method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
公共响应性createProduct(@RequestBody@Validated Product input){
Product Product=createProductFromJson(输入);
Product savedProduct=productRepository.save(产品);
返回新的ResponseEntity(产品、responseHeaders、HttpStatus.CREATED);
}
@密码过滤器
@预授权(@productRestController.validatePermission(身份验证,#产品)”)
@RequestMapping(value=“/{id}”,使用={Constants.JSON\u CONTENT\u TYPE},方法={
RequestMethod.PUT})
@ResponseStatus(HttpStatus.OK)
public ResponseEntity updateProduct(主体,@PathVariable Long id,
@RequestBody@Validated Product(已验证产品){
...
返回新的响应属性(updatedProduct,HttpStatus.OK);
}
createProduct方法中未调用
@Validated
。 如果我对
@PreAuthorize
进行注释,则将在createProduct方法中调用
@Validated
。注释甚至不在createProduct方法上,因此我不确定这是否与
@InitBinder
有关


这是一个SpringBoot 1.4.1应用程序。我正在使用mockmvc
@SpringBootTest
来测试此方法

结果表明,
@InitBinder
方法需要公开才能调用验证:

@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(productValidator);
}