: addFormatters 메소드 파라미터로 FormatterRegistry 타입을 받는다. 이때, 구현체로 WebConversionService를 받는다.
사용자가 명시적으로 Converter를 등록하면 소스와 타겟 타입이 동일하게 지정된 스프링의 기본 Converter보다 우선적으로 적용
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToUrlConverter());
registry.addConverter(new StringToUserConditionalConverter());
registry.addConverterFactory(new StringToEnumConverterFactory());
}
}
파라미터를 값을 얻는다
Object arg = this.resolveName(resolvedName.toString(), nestedParameter, webRequest);
// resolveName 메소드 일부
if (arg == null) {
String[] paramValues = request.getParameterValues(name);
if (paramValues == null) {
paramValues = request.getParameterValues(name + "[]");
}
if (paramValues != null) {
arg = paramValues.length == 1 ? paramValues[0] : paramValues;
}
}
return arg;
현재 arg는 String 이지만 타입 변환이 필요하다면 컨버터를 통한 변환이 발생해야 한다
if (binderFactory != null && (arg != null || !hasDefaultValue)) {
// 필요하면 타입변환을 하라
arg = convertIfNecessary(parameter, webRequest, binderFactory, namedValueInfo, arg);
if (arg == null) {
if (namedValueInfo.defaultValue != null) {
arg = this.resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue);
arg = convertIfNecessary(parameter, webRequest, binderFactory, namedValueInfo, arg);
} else if (namedValueInfo.required && !nestedParameter.isOptional()) {
this.handleMissingValueAfterConversion(resolvedName.toString(), nestedParameter, webRequest);
}
}
}