【问题标题】:java pass string web request to non string @RequestParamjava将字符串Web请求传递给非字符串@RequestParam
【发布时间】:2019-01-08 18:47:56
【问题描述】:

我正在开发一个具有 java 后端的反应应用程序。 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);
} 

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

【问题讨论】:

    标签: javascript java http-request-parameters


    【解决方案1】:

    您发送的不是 null 作为值,而是发送一个包含单词“null”的字符串。

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

    @RequestParameter docs

    如果您无法编辑 javascript,您仍然有一些选择……spring 真正在做的是从 http 请求到 Java 变量实例的数据绑定值。您可以根据需要覆盖或绕过它。 (这种方法是这样做的“旧”方法,也是 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
    }
    

    【讨论】:

    • 感谢您的回复。我进行了您推荐的更改,但会导致 nullPointerException 错误。使用调试器,我看到请求返回,它到达 if 语句:if(!issues.equals("null")){issue = Boolean.valueOf(issues) } 有什么想法吗?
    • @rralbrittonYeah 我给了你错误的方法应该是 request.getParameter('date');
    【解决方案2】:

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

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

    解决方案 2:将 RequestParam 类型(如 Date、Boolean)替换为 String。然后您可以进行相应的处理。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2018-09-02
      • 2012-06-13
      • 2020-04-08
      • 2016-06-01
      相关资源
      最近更新 更多