[Java][Spring] Spring Securityのアノテーションを付けたら、Type MismatchでAutowireできないときの対処方法
背景
Spring Securityのメソッドアノテーションでアクセス制御したいと思いました。
既存のクラスにアノテーションを付けました。
MyService.java
@Component
public class MyService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void someAdminAction() {
/* ... */
}
}
アノテーションを有効にするためにコンフィグレーションクラスを作りました。
MethodSecurityConfiguration.java
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration {
}
MyService
はコントローラにインジェクションしていました。
MyController.java
@RestController
public class MyController {
@Autowired
private MyService myService;
/* ... */
}
起きたこと
MyControllerにMyServiceをインジェクションできない!
なんかType Mismatchとかいってる!!
原因
アノテーションを付けたクラスはAOPしてプロキシになるので、型が変わっている(?)みたいです。
解決策
proxyTargetClass = true
というオプションを追加しました。
MethodSecurityConfiguration.java
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
public class MethodSecurityConfiguration {
}