2016-10-25 10 views
2

ブールタイプのフラグ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; 
} 
} 

例外:

答えて

0

HARDIが答えとしてあなたはObject型としてブールフィールドをマップすると仮定してこれを行うための2つの方法があります -

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 -

1. setterメソッドをカスタマイズしますカスタムデシリアライザの作成 -

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 
} 
+0

これは役に立った、ありがとうDerick :-) – Prasanna

+1

これはJackson Apiのバグですか?それは私たちがカスタムの直列化を書くのを避けることができるように、最新バージョンのjackson apiで注意を払っていますか?親切なアドバイス。 – Prasanna

0

私はセッターがブール値として設定しているため、これがあると思います。以下は動作します。この場合、私は非直列化されたクラスのオブジェクトとしてブール値を取っています。

public class Json { 
    private String key1; 
    private Object booleanKey; 
    public String getKey1() { 
     return key1; 
    } 
    public void setKey1(String key1) { 
     this.key1 = key1; 
    } 
    public Object getBooleanKey() { 
     return booleanKey; 
    } 
    public void setBooleanKey(Object booleanKey) { 
     this.booleanKey = booleanKey; 
    } 
} 

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 

     String jsonString = "{\"key1\" : \"value1\", \"booleanKey\" : true}"; 

     ObjectMapper mapper = new ObjectMapper(); 
     Json obj = mapper.readValue(jsonString,Json.class); 
     if (obj.getBooleanKey() instanceof Boolean) { 
      System.out.println("booleanKey is boolean"); 
     } else { 
      System.out.println("booleanKey is some other beast"); 
     } 


     jsonString = "{\"key1\" : \"value1\", \"booleanKey\" : \"test\"}"; 
     obj = mapper.readValue(jsonString, Json.class); 
     if (obj.getBooleanKey() instanceof Boolean) { 
      System.out.println("booleanKey is boolean"); 
     } else { 
      System.out.println("booleanKey is some other beast"); 
     } 
    } 
+0

は、私に道を示すためにあなたのアルディありがとう私はもしそのないいくつかのカスタムアノテーションを持つことができますブール値は私はカスタムメッセージを送ることができますか?提案してください。 – Prasanna

関連する問題