针对枚举验证JSON字段

问题描述 投票:1回答:1

我正在使用POJO直接从收到的JSON构建我的Jackson's ObjectMapper。为此,我使用@JsonProperty注释注释我的字段(在这种情况下字段是抽象方法,因为我使用AutoValue来减少样板)。

现在,我的POJO中的一些字段是enums,其中JSON显然包含常规字符串。我想以某种方式验证那些JSON字段确实在构造对象之前提交给给定的枚举类型。

这是一个例子。

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

此属性的类型为enum MessageType,相应的JSON字段为ie。 “messageType”:“A_1”是一个字符串。

现在,如果“messageType”类似于“blabla”,我希望验证失败。

有没有办法使用Hibernate Validator进行注释验证?

java hibernate validation enums jackson
1个回答
0
投票

@JsonProperty(value =“messageType”)public abstract可选的messageType();

假设你有,MessageType为enum,具有不同的值A_1,A_2 ......

创建一个静态实用程序方法,以根据接收/发送的json值序列化/反序列化枚举值

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();
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.