2016-07-26 2 views
1

Я пытаюсь получить аннотации проверки Java Bean для работы с переменными пути и параметрами запроса в Spring MVC-контроллере. (Окружающая среда: Spring Boot v1.3.5, Springxxx 4.2.6, язык программирования Kotlin 1.0.3)Проверка Java bean на Spring MVC Controller PathVariables

например.

@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 как 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 как предложено выглядит как класс контроллера проксируется (который, кажется, как ожидалось - https://github.com/spring-projects/spring-security/issues/3215).

@Validated 
interface SomeResource { 
.... 

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

Но это приводит к тому, что настройка отображения запроса mvc Spring игнорирует SomeController. Отладка через код среды Spring выглядела как org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods() просматривает список компонентов и пытается определить методы обработчика, но вышеупомянутый контроллер игнорируется внешними взглядами, поскольку он встречает proxy, и он не несет аннотации @Controller или @RequestMapping.

Кто-нибудь знает, чего не хватает? Кажется, есть много информации, которая, кажется, предполагает, что это должно быть возможно, но не может найти рабочий пример.

ответ

2

Ну, я нашел проблему - это было потому, что прокси, созданный для контроллера, был динамическим прокси JDK. Когда я заставил его быть прокси-сервером CGLIB, он начал работать нормально.

По умолчанию классы Kotlin являются окончательными и, следовательно, вынуждены использовать JDK Dynamic proxy, но маркировка контроллера как «открытая» была недостаточной, чтобы принудить ее использовать CGLIB. Пришлось добавить @Scope (proxyMode = ScopedProxyMode.TARGET_CLASS) в класс контроллера

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

 Смежные вопросы

  • Нет связанных вопросов^_^