gpt4 book ai didi

java - Fasterxml Jackson 自动将非 boolean 值转换为 boolean 值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:03 26 4
gpt4 key购买 nike

我有一个 pojo 类,其中一个标志 isControl 是 boolean 类型。

当此属性获得除true 或false 之外的非 boolean 值时,fasterxml jackson 会自动将输入值转换为true。调试了几个小时后,我发现这是在 setter 方法 setIsControl 中发生的。

如果此属性的输入值为非 boolean 值,我想传递自定义消息。我已经编写了自己的注释来验证此属性的输入值,如果它不是 boolean 值但 jackson 在检查我的自定义 validator 之前绑定(bind)了该值,则返回自定义消息。

使用 jackson 版本>>> 2.6.3。任何帮助将不胜感激。

控制.java

    @JsonProperty(required = true)
@NotNull(message = "isControl cannot be null")
private Boolean isControl;

public Boolean getIsControl() {
return isControl;
}


@CheckBoolean(fieldName = "isControl")
public void setIsControl(Boolean isControl) {
this.isControl = isControl;
}

public class BooleanValidator implements ConstraintValidator<CheckBoolean, Boolean> {

private String fieldName;

@Override
public void initialize(CheckBoolean constraintAnnotation) {
this.fieldName = constraintAnnotation.fieldName();
}

@Override
public boolean isValid(Boolean value, ConstraintValidatorContext context) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(
String.format("The control flag %s should be either true or false", fieldName))
.addConstraintViolation();

if (value != null) {
boolean isBoolean;
if (value instanceof Boolean) {
isBoolean = ((Boolean)value).booleanValue();
System.out.println("var isBoolean: " +isBoolean);
return true;
} else if (value instanceof Boolean && Boolean.FALSE.equals(value)) {
isBoolean = ((Boolean)value).booleanValue();
return true;
} else {
return false;
}
}
return false;
}
}

异常(exception):

最佳答案

假设您将 boolean 字段映射为 HARDI 回答的对象类型,有两种方法可以做到这一点 -

<强>1。自定义setter方法 -

    public class DTO {
String key1;
Object booleanKey;

public Object getBooleanKey() {
return booleanKey;
}

public void setBooleanKey(Object booleanKey) {
if (booleanKey instanceof Boolean) {
this.booleanKey = booleanKey;
} else {
// custom code here
}

}

public String getKey1() {
return key1;
}

public void setKey1(String key1) {
this.key1 = key1;
}
}

<强>2。编写自定义反序列化器-

class BooleanKeyDeserializer extends JsonDeserializer<Object> {

@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Object object = p.readValueAs(Object.class);
if (!(object instanceof Boolean)) {
// custom code here
}
return object;
}
}

注释要对其执行自定义反序列化的字段 -

class DTO {
String key1;
@JsonDeserialize(using = BooleanKeyDeserializer.class)
Object booleanKey;
//setters getters
}

关于java - Fasterxml Jackson 自动将非 boolean 值转换为 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com