- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在对象到达 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/
我是一名优秀的程序员,十分优秀!