java 将字符串网络请求传递给非字符串@RequestParam

java pass string web request to non string @RequestParam

我正在开发一个具有 java 后端的 React 应用程序。 React 前端向 java Web 服务控制器发送 URL 请求,并在该 Web 服务控制器中定义了变量类型。由于 URL 请求是一个字符串,因此我在处理非字符串值时遇到了麻烦。由于 Javascript 不是像 Java 那样的强类型语言,我无法在前端定义变量类型。

网络请求示例:

localhost:8080/filteredCSV.json?status=UNDER_ACTIVE_REVIEW,AUTHORIZED_BY_DWB,UNDER_CONSTRUCTION,CONSTRUCTION_COMPLETED&engineerEmail=null&issues=null&date=null

网络服务控制器:

@RequestMapping(value = "/filteredCSV.json")
@ResponseBody
public WebserviceResponse<?>filteredCSV(
    @RequestParam(value="status") ArrayList status,                             
    @RequestParam(value="engineerEmail") ArrayList engineerEmail,
    @RequestParam(value="issues", required=false) Boolean issues,
    @RequestParam(value="date", required=false) Local Date date){

 return service.filteredCSV(status, engineerEmail, issues, date);
} 

如果布尔值或日期值为 null,则 null 将作为字符串传递,这会导致类型不匹配错误并且程序停止。一旦它到达 Web 服务控制器,我似乎没有办法将字符串更改为非字符串空值。我理解为什么会发生这种情况,但我不确定是否有办法解决它,以便我可以将 null 作为值而不是 null 作为字符串传递。我只是搞砸了吗?有没有办法解决这个问题?

您没有将 null 作为值发送,您发送的是包含单词“null”的字符串。

不发送值“”,而不是字符串值 'null'。这是 @RequestParameter 在应该忽略参数时所期望的。

@RequestParameter docs

如果您无法编辑 javascript,您还有一些选择……spring 真正在做什么,从 http 请求到 [=22= 的实例有数据绑定值] 变量。您可以根据需要覆盖或绕过它。 (这种方法是 'old' 的做法,也是 spring 注释希望解决的问题)。

@RequestMapping(value = "/filteredCSV.json")
@ResponseBody
public WebserviceResponse<?>filteredCSV(HttpRequest request){
    String date = request.getParameter('date');
    // Convert date if not 'null' here, and so on
}

我喜欢@zmf 发布的建议,但是如果想找到其他解决方法。请参考一些我认为可行的方法:

方案一:可以引入过滤器,将请求参数全部解析为字符串。当您遇到 null as string 时不要进一步发送参数,它将在控制器级别被视为 null。

方案二:将请求参数类型如Date、Boolean替换为String。然后您可以进行相应的处理。