Search code examples
javaspringspring-restcontroller

How to add HttpServletRequest param to complex RestController bean?


I have a complex bean holding the rest parameters, eg:

public class MyRestParams {
    private HttpServletRequest req;
    private @NotBlank String name;

    //getter, setter
}

Usage:

@RestController 
@RequestMapping("/xml")
public class MyServlet {
    @RequestMapping(value = "/")
    public void getTest(@Valid MyRestParams p) {
        Sysout(p.getName()); //works when invoked with /xml?name=test
        Sysout(p.getReq()); //always null
    }
}

Problem: the HttpServletRequest is always null. Isn't it possible to add this parameter within the bean itself?


Solution

  • You can provide an implementation for HandlerMethodArgumentResolver to resolve your MyRestParams:

    public class MyRestParamsArgumentResolver implements HandlerMethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.getParameterType().equals(MyRestParams.class);
        }
    
        @Override
        public Object resolveArgument(MethodParameter parameter, 
                                      ModelAndViewContainer mavContainer,
                                      NativeWebRequest webRequest,
                                      WebDataBinderFactory binderFactory) throws Exception {
            MyRestParams restParam = new MyRestParams();
            restParam.setReq((HttpServletRequest) webRequest.getNativeRequest());
    
            return restParam;
        }
    }
    

    Then register it in your WebMvcConfigurerAdapter:

    @EnableWebMvc
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(new MyRestParamsArgumentResolver());
        }
    }