Spring core 모듈에서 제공하는 ResolvableType 의 활용
Basic Example
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.core.ResolvableType;
public class Example {
private List<String> myList;
public Example() {
ResolvableType resolvableType = ResolvableType.forField(getClass().getDeclaredField("myList"));
Class<?> collectionType = resolvableType.getGeneric(0).resolve();
System.out.println("Collection type: " + collectionType);
}
}
Example Class 안에 List
ResolvableType resolvableType = ResolvableType.forField(getClass().getDeclaredField(“myList”));
- getClass() 는 해당 메소드를 호출한 런타임 객체를 의미한다. 즉, Example 클래스의 인스턴스에서 이 함수를 호출했으므로 이는 example 인스턴스를 가리키게 된다.
Class<?> collectionType = resolvableType.getGeneric(0).resolve();
- getGeneric(0) 을하여 generic type argument 의 첫번째가 가리키는 값을 collectionType 변수에 담는다.
- 이제 알아낸 generic type argument 을 출력할 수 있다.
Spring Security oAuth2 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public String getLoginPage(Model model) {
Iterable<ClientRegistration> clientRegistrations = null;
ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository)
.as(Iterable.class);
if (type != ResolvableType.NONE &&
ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) {
clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository;
}
clientRegistrations.forEach(registration ->
oauth2AuthenticationUrls.put(registration.getClientName(),
authorizationRequestBaseUri + "/" + registration.getRegistrationId()));
model.addAttribute("urls", oauth2AuthenticationUrls);
return "oauth_login";
}
코드 설명
1
2
3
if (type != ResolvableType.NONE && ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) {
clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository;
}
- clientRegistrationRepository 가 Iterable of ClientRegistration objects 인지 확인한다.
- 타입 체크가 성공하면, clientRegistrations 에 clientRegistrationRepository 를 할당한다.
1
2
3
4
5
6
clientRegistrations.forEach(registration ->
oauth2AuthenticationUrls.put(registration.getClientName(),
authorizationRequestBaseUri + "/" + registration.getRegistrationId()));
model.addAttribute("urls", oauth2AuthenticationUrls);
return "oauth_login";
- 이 값을 순회하면서 oauth2AuthenticationUrls 에 세팅하고 model 객체의 “urls” 키 값에 set 한 뒤 oauth_login 페이지로 넘긴다.