Spring Boot: вручную связать объект из веб-запроса с помощью HandlerMethodArgumentResolver - PullRequest
1 голос
/ 11 февраля 2020

Мне нужно построить объект еще до того, как он достигнет контроллера, и я нашел способ сделать это с помощью 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 связывает объекты с параметрами запроса до прихода в контроллер, но мне не повезло.

1 Ответ

0 голосов
/ 11 февраля 2020

Одним из решений является использование пружины AOP для обработки всех @Controller методов, имеющих UserParams в качестве параметра. Затем вам нужно получить доступ к WebRequest, чтобы получить sessionId, и это немного сложнее; вам нужно создать @Bean @Scope("request") (например, назвать его WebRequestAccessor ), которое будет содержать поле @Autowired типа WebRequest. Автоматически подключите боб WebRequestAccessor к вашему @Aspect, чтобы использовать его поле WebRequest, которое затем дает вам доступ к sessionId. Установите sessionId для параметра UserParams, затем позвольте рекомендованному методу продолжить свою работу.

Посмотрите здесь о том, как написать и использовать @ Aspect.

ОБНОВЛЕНИЕ

Вы можете использовать JSESSIONID вместо HttpSession.getId(). Просто аннотируйте private String sessionId с помощью @CookieValue("JSESSIONID").

ОБНОВЛЕНИЕ 2

Я уверен, что вы должны использовать ServletModelAttributeMethodProcessor (или ModelAttributeMethodProcessor ) вместо HandlerMethodArgumentResolver.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...