Spring MVC控制器PathVariables上的Java beanvalidation

我试图让Java Beanvalidation注释在Spring MVC控制器中与路径variables和查询参数一起工作。 (环境:Spring Boot v1.3.5,Springxxx 4.2.6,Kotlin 1.0.3编程语言)

例如

@RequestMapping(value = "/{someId}" ...) fun getSomething(**@SomeValidId** @PathVariable("someId") someId: String):... 

我已经按照https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/中所述添加了org.springframework.validation.beanvalidation.MethodValidationPostProcessor,并且还添加了org。 springframework.validation.beanvalidation.LocalValidatorFactoryBean作为上面的validatorFactory。

 @Configuration ...class .... { ... @Bean open fun localValidatorFactoryBean() = LocalValidatorFactoryBean() @Bean open fun methodValidationPostProcessor() : MethodValidationPostProcessor { val methodValidationPostProcessor = MethodValidationPostProcessor() methodValidationPostProcessor.setValidator(localValidatorFactoryBean()) return methodValidationPostProcessor } 

}

但是当我使用org.springframework.validation.annotation.Validated注解Controller类(或者它实现的接口)时,建议看起来像控制器类被代理(这似乎是预期的 – https://github.com/spring -projects / spring-security / issues / 3215 )。

 @Validated interface SomeResource { .... @RestController @RequestMapping("/somepath") class SomeController ......: SomeResource .... 

但是这会导致Spring mvc请求映射设置忽略SomeController。 通过Spring框架代码调试看起来像org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods()通过bean列表,并尝试检测处理程序方法,但上面的控制器被忽略的外观,因为它遇到代理实例,它不带有@Controller或@RequestMapping注释。

有没有人有任何想法缺少什么? 似乎有很多信息似乎表明这应该是可能的,但找不到一个工作的例子。

那么我发现这个问题 – 这是因为为控制器创建的代理是一个JDK动态代理。 当我强迫它成为一个CGLIB代理,它开始工作正常。

默认情况下,Kotlin类是final的,因此被迫使用JDK Dynamic代理,但将控制器标记为“open”并不足以强制使用CGLIB。 不得不将@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)添加到控制器类

 @RestController @RequestMapping("/somepath") @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) class SomeController ......: SomeResource ....