基于1或0而非true或false,使用Spring的@RequestParam映射Boolean。

51
为什么Spring 3.2只根据请求参数是“0”或“1”来映射我的布尔值?
@RequestParam(required= false, defaultValue = "false") Boolean preview

当请求参数为"?preview=1"时,预览仅为"true",这很奇怪。

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


你知道一种方法,可以忽略默认值为false且必需的请求参数在URL中的完全体现。这意味着我们甚至不需要在URL中放置任何内容来访问该请求参数。在您的示例中,“预览”甚至不会成为URL的一部分。 - Soumitri Pattnaik
6个回答

107

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

我有类似以下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,预期结果会是什么呢? - Raja Anbazhagan
根据 Pavel 提供的源代码链接,它忽略大小写。 - stenix
只是一点小信息: 隐式提供defaultValue会将required设置为false。 因此不需要传递'required=false'。 - dheeraj9499

23

有没有一种方法,可以关闭必需的请求参数,并提供默认值,在URL中甚至不需要提及请求参数? - Soumitri Pattnaik
2
应该足以解决您的问题。{{@RequestParam(defaultValue = "true") boolean notify}} - varra
@SoumitriPattnaik 提供默认值会隐式地将 required 设置为 false。 - I'm_Pratik

0

我猜你在@RequestParam中缺少value="preview"。由于这个原因,Spring总是将变量preview设置为false,因为这是defaultValue。

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

0

你可以使用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;
}

0

我们可以使用

@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,可以从 API 调用中的下面图片enter image description here中看到。


-1

我之前也遇到了使用Feign Client时的同样问题。我将属性DTO从boolean改为Boolean后,问题得以解决。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题有新答案时收到通知,可以关注该问题。您也可以添加赏金以引起更多关注。- [来自审阅] (/ review / low-quality-posts / 34485577) - pmacfarlane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接