2017-12-19 7 views
1

私はPOJOを受信したJSONから直接Jackson's ObjectMapperを使用して作成しています。その目的のために、私はフィールドに注釈を付けます(この場合、フィールドは抽象メソッドです)。@JsonProperty注釈を使用して、定型文を減らすためにAutoValueを使用しています。enumに対してJSONフィールドを検証する

私のPOJOのフィールドのいくつかはenumsです。ここでJSONは明らかに通常の文字列を含んでいます。オブジェクトが構築される前に、それらのJSONフィールドが実際に指定された列挙型にサブミットすることを何らかの形で検証したいと思います。

これは例です。

@JsonProperty(value = "messageType") 
public abstract Optional<MessageType> messageType(); 

このプロパティのタイプはenum MessageTypeであり、対応するJSONフィールドはieです。 "messageType": "A_1"は文字列です。

ここで、 "messageType"が "blabla"のようなものであれば、検証は失敗したいと思います。

Hibernate Validatorを使用してアノテーションでそれを検証する方法はありますか?

+1

enum messageTypeにバインドされていない値を渡したときに受け取った現在の応答は何ですか? Jacksonライブラリまでは、要求を拒否し、検証失敗メッセージで事前に通知します。 – Rizwan

+0

個別の検証が必要な特別な理由はありますか? Jacksonのdatabinderは問題を示し、例外を捕まえることができます。新しいバージョンのJacksonでは、問題の正確な性質に関する詳細情報が得られます。 もっと精巧な(または手動の)チェックが必要な場合は、 'java.lang.String'をとるセッターを宣言できますが、実際のフィールドにチェックして変換するために独自のコードを使用します。こうすることで、呼び出し側が処理できる、より具体的な例外( 'IOException'のサブタイプ)の問題を示すことができます。 – StaxMan

答えて

0

@JsonProperty(値= "messageType") public abstract任意のmessageType();

あなたが持っている想定、MessageTypeの異なる値を持つ列挙型としてA_1、A_2 ...

public static <T extends Enum<T>> T getEnumFromJson(Class<T> enumClass, String value) 
{ 
    if(enumClass == null) throw new IllegalArgumentException("EnumClass value can't be null"); 
    for(Enum<?> enumValue : enumClass.getEnumConstants()){ 
     if(enumValue.toString().equalsIgnoreCase(value)){ 
     return (T) enumValue; 
     } 
    } 
//Validation message construct to give more meaningful details to end-user 
    StringBuilder erroMsg = new StringBuilder(); 
    boolean bFirst = true; 
    for(Enum<?> enumValue : enumClass.getEnumConstants()) { 
    errorMessage.append(bFirst ? "": ", ").append(enumValue); 
    bFirst = false; 
    } 

    throw new IllegalArgumentException(value + " is invalid value, Supported value are "+ errorMessage); 
} 

//Enum as represented below 
public enum MessageType { 
    A_1, 
    A_2, 
    A_3 

    @JsonCreator 
    public static MessageType fromValue(String value){ 
    return getEnumFromJson(MessageType.class, value); 
    } 

    @JsonValue 
    public String toJson(){ 
    return name().toLowerCase(); 
    } 

} 
値受信/送信されたJSONから列挙値のためのデシリアライズ/シリアライズする静的ユーティリティメソッドを作成します。
関連する問題