На самом деле это довольно просто, даже без каких-либо аннотаций Spring @RequestParam
внутри POJO.То, что вы ищете, это пользовательский WebArgumentResolver
.Вот полный пример:
@Service
public class UserArgumentResolver implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
if (methodParameter.getParameterType() == User.class) {
return new User(webRequest.getParameter("user"));
}
return WebArgumentResolver.UNRESOLVED;
}
}
Код довольно понятен: если один из параметров обработчика имеет тип User
, извлеките параметр запроса с именем user
и верните все, что вы хотите (конечно,он должен быть назначен на User
. WebArgumentResolver.UNRESOLVED
означает, что распознаватель был неспособен обработать этот параметр, и последующие распознаватели должны быть проверены.
К сожалению, распознаватель не выбран по умолчанию, он должен быть зарегистрирован:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="customArgumentResolver" ref="userArgumentResolver"/>
</bean>
<mvc:annotation-driven />
Вот и все! Ваш обработчик теперь может выглядеть так:
@RequestMapping
public void handle(User user) {
//...
}