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 在应该忽略参数时所期望的。
如果您无法编辑 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。然后您可以进行相应的处理。
我正在开发一个具有 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 在应该忽略参数时所期望的。
如果您无法编辑 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。然后您可以进行相应的处理。