Java Spring引导:使用HandlerMethodArgumentResolver从webRequest绑定一个对象
我需要在对象到达控制器之前构建它,我发现一种方法是使用Java Spring引导:使用HandlerMethodArgumentResolver从webRequest绑定一个对象,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,我需要在对象到达控制器之前构建它,我发现一种方法是使用HandlerMethodArgumentResolver 基本上,我有一个映射到请求参数的pojo,但我想在pojo到达控制器之前在该pojo中设置一些其他字段 POJO:UserParams.java @AllArgsConstructor public class UserParams { private String firstName; private String lastName; private Str
HandlerMethodArgumentResolver
基本上,我有一个映射到请求参数的pojo,但我想在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;
}
因此,当请求最终到达控制器时,我有一个包含sessionId的userParams
我试着看了很多地方(programcreek.com有很多WebDataBinder的例子),并试图在来到控制器之前找出Spring是如何用请求参数绑定对象的,但我没有运气 一种解决方案是使用spring AOP来处理所有以UserParams
作为参数的@Controller
方法。然后您必须访问WebRequest
,才能获得sessionId
,这有点棘手;您必须创建一个@Bean@Scope(“请求”)
(例如,将其命名为WebRequestAccessor),其中包含@Autowired
类型的WebRequest
字段。自动将WebRequestAccessor bean连接到@Aspect
中,以便使用其WebRequest
字段,然后您可以访问sessionId
。在UserParams
参数上设置sessionId
,然后让建议的方法继续工作
看看如何编写和使用@Aspect
更新
您可以使用JSESSIONID
而不是HttpSession.getId()
。只需使用@CookieValue(“JSESSIONID”)
注释私有字符串sessionId
更新2
我非常确定您应该使用(或)而不是HandlerMethodArgumentResolver
一个解决方案是使用spring AOP来处理所有@Controller
方法,这些方法将UserParams
作为参数。然后您必须访问WebRequest
,才能获得sessionId
,这有点棘手;您必须创建一个@Bean@Scope(“请求”)
(例如,将其命名为WebRequestAccessor),其中包含@Autowired
类型的WebRequest
字段。自动将WebRequestAccessor bean连接到@Aspect
中,以便使用其WebRequest
字段,然后您可以访问sessionId
。在UserParams
参数上设置sessionId
,然后让建议的方法继续工作
看看如何编写和使用@Aspect
更新
您可以使用JSESSIONID
而不是HttpSession.getId()
。只需使用@CookieValue(“JSESSIONID”)
注释私有字符串sessionId
更新2
我很确定您应该使用(或)而不是
HandlerMethodArgumentResolver
是否可以在HandlerMethodArgumentResolver中工作?我在解析器中需要它的原因是因为我想让它更通用,所以将来我可以使用同一个解析器类绑定UserParams、OwnerParams、BuyerParams等。我不知道,但您可以让所有这些类实现一个接口(例如,sessiondprovider
,为sessionId
使用setter/getter)然后基于该接口创建@Aspect
。是否无法使其在HandlerMethodArgumentResolver中工作?我在解析器中需要它的原因是因为我想让它更通用,所以将来我可以使用同一个解析器类绑定UserParams、OwnerParams、BuyerParams等。我不知道,但您可以让所有这些类实现一个接口(例如,sessiondprovider
,为sessionId
使用setter/getter)然后基于该接口创建@Aspect
。