java - Spring 启动: Maunally bind an object from a webRequest using HandlerMethodArgumentResolver

标签 java spring spring-boot spring-mvc

我需要在对象到达 Controller 之前构建一个对象,我发现实现此目的的一种方法是使用 HandlerMethodArgumentResolver。

基本上,我有一个映射到请求参数的 pojo,但我想在该 pojo 到达 Controller 之前设置一些其他字段。

POJO:UserParams.java

@AllArgsConstructor
public class UserParams {
    private String firstName;
    private String lastName;
    private String sessionId;
}

假设我的请求为 localhost:8080/user?firstName=John&lastName=Doe

因此,在我的解析器中,我想使用上述请求中的请求参数绑定(bind) UserParams 对象,并填充 sessionId 字段,并返回具有附加值的绑定(bind)对象。

@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;
}

因此,当请求最终到达 Controller 时,我会得到带有 sessionId 的 userParams 。

我尝试查看很多地方(programcreek.com 有很多 WebDataBinder 的示例),并尝试了解 Spring 在访问 Controller 之前如何使用请求参数绑定(bind)对象,但我没有运气。

最佳答案

一种解决方案是使用spring AOP来处理所有@Controller方法具有UserParams作为参数。然后你必须访问WebRequest为了得到 sessionId这有点棘手;你必须创建一个 @Bean @Scope("request") (例如,将其命名为 WebRequestAccessor),其中包含 @Autowired类型字段WebRequest 。将 WebRequestAccessor bean Autowiring 到您的 @Aspect 中为了使用它的WebRequest然后您可以访问 sessionId 字段。设置sessionId关于UserParams参数然后让建议的方法继续工作。

看看here关于如何编写和使用 @Aspect。

更新

您可以使用JSESSIONID而不是HttpSession.getId() 。只需注释private String sessionId@CookieValue("JSESSIONID") .

更新2

我很确定你应该使用 ServletModelAttributeMethodProcessor (或 ModelAttributeMethodProcessor )而不是 HandlerMethodArgumentResolver .

关于java - Spring 启动: Maunally bind an object from a webRequest using HandlerMethodArgumentResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60159483/

相关文章:

java - keystore 未保存到文件

java - Struts 2 使用状态索引

java - 对字符串数组执行乘法操作

java - 考虑在您的配置中定义一个类型为 'org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository' 的 bean

spring-boot - querydsl生成的q源代码未正确导入

java - 如何从 Spring MVC\Boot Controller 方法正确检索记录的用户信息?

java - 如何在 Spring Boot 中配置自定义 AccessDecisionManager 和自定义 AuthenticationProvider

Java - 正则表达式相互匹配

java - Spring Web服务: What should be good starting point?

java - 如何在 Spring Boot 中手动验证用户身份?