Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导:使用HandlerMethodArgumentResolver从webRequest绑定一个对象_Java_Spring_Spring Boot_Spring Mvc - Fatal编程技术网

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