gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:41 25 4
gpt4 key购买 nike

我需要在对象到达 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com