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 타입으로 선언된 myList 필드가 있다.

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 페이지로 넘긴다.

comments powered by Disqus