Spring @RequestParamMap布尔值基于1或0而不是true或false

mepcadol  于 2022-12-21  发布在  Spring
关注(0)|答案(5)|浏览(550)

为什么Spring3.2只根据请求参数是“0”还是“1”来Map我的布尔值?

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

当requestparam为"?preview=1"时,预览将仅为"true",这是wierd
我希望它是"?preview=true"。我该怎么做呢?

8ftvxx2r

8ftvxx2r1#

我想我们可能需要更多的细节才能有效地回答你的问题。
我的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解释为真,将?bar=false?bar=0?bar=no解释为假。
True/False和yes/no值忽略大小写。

cwtwac6a

cwtwac6a2#

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

pzfprimi

pzfprimi3#

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

ssm49v7z4#

我们可以用

@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调用中引用。

wxclj1h5

wxclj1h55#

我想您在@RequestParam中缺少value=“preview”,因此Spring总是将变量preview设置为false,因为这是默认值。
第一个月

相关问题