Мне нужно построить объект еще до того, как он достигнет контроллера, и я нашел способ сделать это с помощью HandlerMethodArgumentResolver
.
По сути, у меня есть pojo, который сопоставляется с параметрами запроса, но я хочу установить некоторые другие поля в этом pojo, прежде чем он достигнет контроллера.
POJO: UserParams. java
@AllArgsConstructor
public class UserParams {
private String firstName;
private String lastName;
private String sessionId;
}
Допустим, мой запрос приходит как localhost:8080/user?firstName=John&lastName=Doe
Итак, в моем преобразователе я хочу связать объект UserParams используя параметры запроса из вышеуказанного запроса, заполните поле sessionId
и верните связанный объект с дополнительным значением.
@Component
public class UserParamsResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(final MethodParameter parameter) {
return parameter.getParameterType().isAssignableFrom(UserParams.class);
}
@Override
public Object resolveArgument(final MethodParameter parameter,
final ModelAndViewContainer mavContainer,
final NativeWebRequest webRequest,
final WebDataBinderFactory binderFactory) {
WebDataBinder binder = new WebDataBinder(BeanUtils.instantiateClass(parameter.getParameterType()));
ServletRequestParameterPropertyValues values = new ServletRequestParameterPropertyValues(((ServletWebRequest) webRequest).getRequest());
binder.bind(values);
BindingResult result = binder.getBindingResult();
// UserParams userParams = how to get this object?
// userParams.setSessionId(userParams.getLastName + Math.random())
return userParams;
}
Итак, когда запрос в конце концов достигает контроллера, у меня есть userParams с sessionId в нем.
Я попытался посмотреть во многих местах (на сайте programcreek.com было много примеров для WebDataBinder) и попытался выяснить, как Spring связывает объекты с параметрами запроса до прихода в контроллер, но мне не повезло.