カスタム メソッド プロセッサを提供することでそれを行うことができました。以下はサンプルコードです。
カスタム実装:
public class OrderControllerArgumentResolver extends
ModelAttributeMethodProcessor {
public OrderControllerArgumentResolver() {
super(true);
}
@Override
public boolean supportsParameter(MethodParameter paramMethodParameter) {
//Resolve - custom annotation created to differentiate order parameter from others.
//This is to make sure this resolver is used only while resolving OrderDTO is used as method parameter
if (paramMethodParameter.getParameterAnnotation(Resolve.class) != null) {
return true;
}
return false;
}
@Override
protected final Object createAttribute(String attributeName,
MethodParameter parameter, WebDataBinderFactory binderFactory,
NativeWebRequest request) throws Exception {
//Instantiate appropriate order instance based on input.
return BeanUtils.instantiateClass(OrderTypeEnum.getDTOClass(request
.getParameter("orderType")));
}
@Override
protected void bindRequestParameters(WebDataBinder binder,
NativeWebRequest request) {
ServletRequest servletRequest = request
.getNativeRequest(ServletRequest.class);
ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder;
servletBinder.bind(servletRequest);
}
}
構成:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean
class="test.util.OrderControllerArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
このアプローチにより、望ましい結果を達成することができました。しかし、このアプローチが他の問題を引き起こすかどうかはわかりません。提案してください。