簡體   English   中英

如何將HttpServletRequest參數添加到復雜的RestController bean?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM