[英]How to add HttpServletRequest param to complex RestController bean?
我有一個包含其余參數的復雜bean,例如:
public class MyRestParams {
private HttpServletRequest req;
private @NotBlank String name;
//getter, setter
}
用法:
@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
}
}
問題: HttpServletRequest
始終為null。 是否可以在Bean本身中添加此參數?
您可以提供HandlerMethodArgumentResolver
的實現來解析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;
}
}
然后在您的WebMvcConfigurerAdapter
注冊它:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new MyRestParamsArgumentResolver());
}
}
當使用這種形式的方法簽名時,Spring會將您的bean用作模型屬性。 Spring將使用WebDataBinder(例如ServletRequestDataBinder)將您的請求參數綁定到匹配名稱的Bean屬性。
由於沒有與您的bean屬性要求匹配的請求參數,因此永遠不會設置該字段。 即使您的請求中存在名稱為req的請求參數,也無法將其轉換為HttpServletRequest。
要接收實際的請求,請在處理程序方法中添加HttpServletRequest類型的參數
@RequestMapping(value = "/")
public void getTest(@Valid MyRestParams p , HttpServletRequest request) {
Sysout(p.getName()); //works when invoked with /xml?name=test
Sysout(request); //always null
}
如果您不想將自己綁定到Servlet API,則可以使用WebRequest類型的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.