【问题标题】:Pass Multiple Keys in @Requestparam with a Single String Variable使用单个字符串变量在 @Requestparam 中传递多个键
【发布时间】:2020-04-23 18:26:06
【问题描述】:

[![在这张图片中,我必须根据下拉选择搜索人][1]][1]

我想通过@Requestparam 传递这些选择,我有多个键名,但我想一次传递一个键所以,我只想使用 一个字符串 无论参数来自请求它应该获取一个字符串中的键值

我不想这样 @RequestParam(value = "pname", required = false) String pName, @RequestParam(value = "ssn", required = false) String sSN)

我想要这样的东西(即具有单个字符串变量的多个键值

    public List<Patient> getPatientListLike(@RequestParam(required = false) String searchString)

【问题讨论】:

    标签: java spring spring-boot spring-mvc spring-restcontroller


    【解决方案1】:

    你可以使用这样的东西

    @PostMapping("/api/foos")
    @ResponseBody
    public String updateFoos(@RequestParam Map<String,String> allParams) {
        return "Parameters are " + allParams.entrySet();
    }
    curl -X POST -F 'name=abc' -F 'id=123' http://localhost:8080/api/foos
    -----
    Parameters are {[name=abc], [id=123]}
    

    详情请看这里https://www.baeldung.com/spring-request-param

    【讨论】:

      【解决方案2】:

      您可以在 UI 代码中将 searchString 创建为 ssn=ssnValue(用户在屏幕上选择的 ssnValue)并将其传递给 url。

      【讨论】:

        【解决方案3】:

        您可以使用 HttpServletRequest 请求获取查询字符串

        public List<Patient> getPatientListLike(HttpServletRequest request) {
        
            String searchString = request.getQueryString();
        
        }
        

        【讨论】:

          【解决方案4】:

          我认为您可以将方法修改为:

          public List<Patient> getPatientListLike(
              @RequestParam(required = false) String searchString,
              @RequestParam(required = false) String searchType
          )
          

          searchString 是文本框的演示文稿,searchType 是演示文稿下拉值。

          【讨论】:

            【解决方案5】:

            您可以简单地将 String 请求参数替换为 Map&lt;String, String&gt; 请求参数。 resource

            public List<Patient> getPatientListLike(@RequestParam(required = false) Map<String, String> searchParams)
            

            【讨论】:

              【解决方案6】:

              RequestParam 也映射到对象。不要重新发明处理请求的方式,始终遵循最佳 API 设计原则。按原样传递查询参数,其中所有键值对用 & 号分隔。

              GET /search?pname=name&ssn=123
              

              您可能必须使用带有 Jackson 注释的构造函数来帮助编组它。我更喜欢数据结构上的公共字段。

              class SearchParameters {
                 private String pname;
                 private String ssn;
                 // getters-setters
              }
              
              @GetMapping("search")
              public List<Patient> getPatientListLike(SearchParameters parameters)
              

              【讨论】:

              • @GetMapping(value = "/list/search") public List&lt;Patient&gt; getPatientListLike(@RequestParam(required = false) SearchParam parameters){ List&lt;Patient&gt; pList = patientServices.getPatientListLike1(parameters); return pList; } 我正在传递/search?pname=somename 但它在日志中打印null
              • 将字段设为私有,然后添加公共 getter 和 setter。替代解决方案是在构造函数上使用 @JsonCreator 并使用 @JsonProperty 注释标记参数。
              • public class SearchParam { @JsonProperty private String pname; @JsonCreator public SearchParam(String pname) { this.pname = pname; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } } 检查我的服务实施@Override public List&lt;Patient&gt; getPatientListLike1(SearchParam parameters) { List&lt;Patient&gt; patients; patients = patientRepository.findByName(parameters.getPname()); return patients; } 我再次得到相同的空值
              • 从映射中删除 @RequestParam 注释。这个不能用。
              猜你喜欢
              • 1970-01-01
              • 2018-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多