ブールタイプのフラグisControl
のいずれかが存在するpojoクラスを持っています。Fasterxml Jacksonは、ブール値以外の値をブール値に自動的に変換します
true or false
fasterxml jackson以外のブール値以外の値を取得すると、入力値は自動的にtrue
に変換されます。数時間デバッグした後、私はこれがsetterメソッドsetIsControl
で起こっていることを知ります。
このプロパティの入力値がブール値でない場合は、カスタムメッセージを渡します。私は自分の注釈を書いてこのプロパティの入力値を検証し、ブール値ではないがjacksonがカスタムバリデーターをチェックする前に値をバインドしていればカスタムメッセージを返します。
ジャクソン版>>>2.6.3
を使用してください。どんな助けもありがとう。
Control.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;
}
}
例外:
これは役に立った、ありがとうDerick :-) – Prasanna
これはJackson Apiのバグですか?それは私たちがカスタムの直列化を書くのを避けることができるように、最新バージョンのjackson apiで注意を払っていますか?親切なアドバイス。 – Prasanna