2016-07-26 14 views
1

Spring MVCコントローラでパス変数とクエリパラメータを処理するためにJava Bean検証アノテーションを取得しようとしています。 (環境:Spring Boot v1.3.5、Springxxx 4.2.6、プログラミング言語Kotlin 1.0.3)Spring MVCコントローラのJava Bean検証PathVariables

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

https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/に記載され、また上記にvalidatorFactoryようorg.springframework.validation.beanvalidation.LocalValidatorFactoryBean加え、私はorg.springframework.validation.beanvalidation.MethodValidationPostProcessor追加しました。に思わ

@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)。

しかしこれにより、Spring mvcリクエストマッピング設定でSomeControllerが無視されます。 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods()のようなSpringフレームワーク・コードのデバッグは、Beanのリストを調べ、ハンドラ・メソッドを検出しようとしますが、上記のコントローラは、 @Controllerまたは@RequestMapping注釈を持ちません。

誰にも分からないことはありますか?可能なはずだと示唆しているような情報がたくさんあるようですが、実際の例は見つかりませんでした。

答えて

2

まあ私は問題を発見しました。コントローラのために作成されたプロキシがJDKのダイナミックプロキシだったからです。私はそれをCGLIBプロキシにすることを余儀なくされました。

デフォルトでは、Kotlinクラスは最終的なものであり、強制的にJDK動的プロキシを使用しますが、コントローラを 'open'としてマークするだけでCGLIBを使用するように強制することはできません。 @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)をコントローラークラスに追加する必要がありました

@RestController 
@RequestMapping("/somepath") 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 
class SomeController ......: SomeResource .... 
関連する問題