【问题标题】:Spring @RequestParam mapping Boolean based on 1 or 0 instead of true or falseSpring @RequestParam 映射布尔值基于 1 或 0 而不是 true 或 false
【发布时间】:2013-10-11 07:26:30
【问题描述】:

为什么 Spring 3.2 仅基于 requestparam 为 "0" 或 "1" 映射我的布尔值?

@RequestParam(required= false, defaultValue = "false") Boolean preview

只有当请求参数是 "?preview=1" 时,预览才会是 "true",这很奇怪

我希望它是"?preview=true"。我该怎么做?

【问题讨论】:

  • 你知道一种方法吗,其中请求参数具有默认值且必需为 false,可以在 URL 中完全忽略,这意味着我们甚至不必在 URL 中放置任何内容那个请求参数。在您的示例中,preview 甚至不会成为 URL 的一部分。

标签: spring request boolean http-request-parameters


【解决方案1】:

我们可以使用

@GetMapping("/getAudioDetails/organizations/{orgId}/interactions/{interactionId}")
public ResponseEntity<?> getAudioDetails(@PathVariable("orgId") String orgId,@PathVariable("interactionId") String interactionId,
        @RequestParam(name = "verbose", required = false, defaultValue = "false") boolean verbose){
    System.out.println(verbose);
    return null;
}

verbose 是一个布尔标志,默认情况下恰好为 false,这可以从下面的 inage 调用 api 中引用。

【讨论】:

    【解决方案2】:

    可以使用jackson的JsonDeserialize注解,简洁干净

    创建以下反序列化器:

    public class BooleanDeserializer extends JsonDeserializer<Boolean> {
        public BooleanDeserializer() {
        }
    
        public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException {
            return !"0".equals(parser.getText());
        }
    }
    

    并将注释添加到您的 DTO,如下所示:

    public class MyDTO {
        @NotNull
        @JsonDeserialize(using = BooleanDeserializer.class)
        private Boolean confirmation;
    }
    

    【讨论】:

      【解决方案3】:

      我认为我们可能需要更多细节才能有效地回答您的问题。

      我的 Spring 3.2 代码如下:

      @RequestMapping(value = "/foo/{id}", method = RequestMethod.GET)
      @ResponseBody
      public Foo getFoo(
          @PathVariable("id") String id, 
          @RequestParam(value="bar", required = false, defaultValue = "true")
              boolean bar)
      { 
          ... 
      }
      

      Spring 正确地将 ?bar=true?bar=1?bar=yes 解释为 true,并将 ?bar=false?bar=0?bar=no 正确解释为 false。

      True/false 和 yes/no 值忽略大小写。

      【讨论】:

      • 它也做equalsIgnoreCase吗?我的意思是,如果我发送 bar=TRUEbar=TrUebar=yES... 会有什么预期结果?
      • 根据下面Pavel链接的源代码,它忽略了大小写。
      【解决方案4】:

      Spring 应该能够将 true1yeson 解释为 true 布尔值...检查StringToBooleanConverter

      【讨论】:

      • 有没有办法,我们关闭 required 并提供一个默认值,在 URL 中我们甚至不必提及请求参数?
      • {{@RequestParam(defaultValue = "true") boolean notify}} 应该足以解决您的问题。
      • @SoumitriPattnaik 提供默认值隐式地将 required 设置为 false。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2021-04-10
      相关资源
      最近更新 更多