spring - Spring MVC Controller PathVariables 上的 Java bean 验证

标签 spring spring-mvc kotlin bean-validation

我正在尝试让 Java Bean 验证注释与 Spring MVC Controller 中的路径变量和查询参数一起使用。 (环境:Spring Boot v1.3.5、Springxxx 4.2.6、编程语言Kotlin 1.0.3)

例如

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

我添加了 org.springframework.validation.beanvalidation.MethodValidationPostProcessor,如 https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/ 中所述并且还在上面添加了 org.springframework.validation.beanvalidation.LocalValidatorFactoryBean 作为验证器工厂。
@Configuration
...class .... {

...

@Bean
open fun localValidatorFactoryBean() = LocalValidatorFactoryBean()

@Bean
open fun methodValidationPostProcessor() : MethodValidationPostProcessor  {
    val methodValidationPostProcessor = MethodValidationPostProcessor()
    methodValidationPostProcessor.setValidator(localValidatorFactoryBean())

    return methodValidationPostProcessor
}

}

但是当我用注释 Controller 类(或它实现的接口(interface))时
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 在遇到代理实例,它不携带 @Controller 或 @RequestMapping 注释。

有谁知道缺少什么?似乎有很多信息表明这应该是可能的,但找不到一个可行的例子。

最佳答案

好吧,我发现了问题 - 这是因为为 Controller 创建的代理是 JDK 动态代理。当我强制它成为 CGLIB 代理时,它开始正常工作。

默认情况下,Kotlin 类是最终类,因此被迫使用 JDK 动态代理,但将 Controller 标记为“打开”并不足以强制它使用 CGLIB。必须将 @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 添加到 Controller 类

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

关于spring - Spring MVC Controller PathVariables 上的 Java bean 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38579771/

相关文章:

java - 多线程批处理写入和读取数据库

java - Spring REST 安全 : Enable Basic Authentication only on a specific endpoint

java - 为什么 Spring MVC 对 http 缓存控制的支持很差?

android - 如何开发一个分离数据层和 View 层的Android应用程序

mongodb - 带有 Kotlin 的 spring-data-mongodb 上的 @Transient 在读取期间导致异常

spring - WSServletContainerInitializer 和 SpringBeanAutowiringSupport

java - 创建 POJO 并从 Map<String, String> 填充它

java - 运行 TomCat 时 Intellij 中的安全错误

java - 如何调试错误 : java. lang.AssertionError:JSON 路径 "$.name"处没有值

java - 更改 Spring Boot/Netty 中的错误日志记录