【问题标题】:Kotlin - Configure Jackson to throw an exception when a field does not match with a certain valueKotlin - 配置 Jackson 以在字段与某个值不匹配时抛出异常
【发布时间】:2021-12-16 21:05:24
【问题描述】:

我有一个服务接收包含以下内容的 JSON:

{ 
  "name": "test", 
  "gender": "NOT_VALID"
}

JSON 应该映射到这个对象“Person”

data class Person(var name: String, var gender: Gender)

Person 有一个名字(字符串),而 Gender 是一个枚举,例如:

enum class Gender() {
    Male,
    Female,
    NotExplicit
}

我正在尝试实现一个映射器,当给定的 Gender 无法与属于枚举的显式值匹配时,该映射器会失败。 例如,如果我尝试执行以下操作:

ObjectMapper.personValidate(text: String): Person =
try {
    
    val mapper = ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    val readValue: Person = mapper.readValue(text, Person::class.java)
    val person: Person = mapper.readValue(ByteArrayInputStream(text.toByteArray()), Person::class.java)
    person
  } catch (e: Exception) {
    when (e) {
      is JsonParseException, is JsonMappingException -> {
        throw PersonException()
      }
      else -> throw e
    }
  }

我希望出现异常而不是 Person 对象。

当值不匹配时,此代码现在将性别映射为 null。

有什么线索吗?

【问题讨论】:

    标签: kotlin objectmapper


    【解决方案1】:

    你不需要做任何事情。如果您尝试将此类 JSON 反序列化到您的 Person 类中,则会引发异常,这仅仅是因为 Jackson 无法将字符串 NOT_VALID 反序列化为有效的 Gender 值。

    【讨论】:

    • 不行,Jackson 忽略了无效值并将其转换为 null。我之前试过
    • 这可能是因为ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)。你试过没有这个吗?
    • 是的,但那是文档所说的其他内容:确定是否遇到未知属性的功能(不映射到属性的功能,并且没有“任何设置器”或处理程序可以处理它) 是否会导致失败(通过抛出 JsonMappingException)。试过了还是不行
    • 这与无效的枚举值不同。你应该得到一个例外。
    猜你喜欢
    • 2017-07-11
    • 2014-01-29
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多