【发布时间】:2020-02-10 22:35:33
【问题描述】:
我需要在它到达控制器之前构建一个对象,我发现这样做的一种方法是使用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 在访问 Controller 之前如何使用请求参数绑定对象,但我没有运气。
【问题讨论】:
标签: java spring spring-boot spring-mvc