Validación de Java Bean en Spring MVC Controller PathVariables

Estoy intentando que las annotations de validation de Java Bean funcionen con variables de ruta y parameters de consulta en el controller Spring MVC. (Entorno: Spring Boot v1.3.5, Springxxx 4.2.6, lenguaje de progtwigción Kotlin 1.0.3)

p.ej

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

He agregado org.springframework.validation.beanvalidation.MethodValidationPostProcessor como se describe en https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/ y también agregué org. springframework.validation.beanvalidation.LocalValidatorFactoryBean como validatorFactory a lo anterior.

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

}

Pero cuando anoto la class Controller (o la interfaz que implementa) con org.springframework.validation.annotation. Validado como sugerido, parece que la class de controller está proxiada (lo que parece ser el esperado – https://github.com/spring -projects / spring-security / issues / 3215 ).

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

Pero esto hace que la configuration de mapeo de requestes de Spring mvc haga caso omiso de SomeController. La debugging a través del código del marco de Spring parecía org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods () pasa por la list de beans e intenta detectar los methods del manejador, pero el controller anterior se ignora por el aspecto que tiene cuando encuentra un instancia proxy y no lleva las annotations @Controller o @RequestMapping.

¿Alguien tiene alguna idea de lo que falta? Parece que hay mucha información que parece sugerir que esto debería ser posible, pero no se pudo encontrar un ejemplo de trabajo.

Bueno, encontré el problema: fue porque el proxy creado para el controller era un proxy dynamic JDK. Cuando lo obligué a ser un proxy CGLIB, comenzó a funcionar bien.

Por defecto, las classs de Kotlin son definitivas y, por lo tanto, están obligadas a utilizar proxies dynamics JDK, pero marcar el controller como 'abierto' no fue suficiente para obligarlo a usar CGLIB. Tuve que agregar @Scope (proxyMode = ScopedProxyMode.TARGET_CLASS) a la class de controller

 @RestController @RequestMapping("/somepath") @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) class SomeController ......: SomeResource .... 
  • Probar los methods @Async de devolución de vacío de Testing
  • Seguridad de spring. Página de inicio de session multilenguaje basada en url
  • ¿No se necesita NotNull en Kotlin?
  • Clase de datos de Kotlin a JSON con Spring / Jackson
  • Exception Handler no funciona con `spring-boot-starter-data-rest`
  • ¿Por qué Kotlin con Spring MVC JSON devuelve un object vacío?
  • SpringMVC RequestMapping: Añadiendo .xml a la ruta del controller para la respuesta xml
  • No se puede publicar contenido web dynamic con Spring Boot y Kotlin
  • Spring Data JPA / Hibernate "No se puede ubicar Attribute con el nombre de stack"
  • Spring Boot e Hibernate. Manejar la fábrica de sesiones
  • Integración de HTML y CSS con Kotlin y Spring MVC