SpEL 表达式包含与成员变量名称不同的 JSON 字段名称

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

我有这样的东西:

data class Person(
        @JsonProperty("first_name")
        var firstName: String,
        @JsonProperty("last_name")
        var lastName: String,
        @JsonProperty("age")
        var age: Int
)

@GetMapping("/test")
fun testSpEL(): ResponseEntity<Boolean> {

    val person = Person("Tom", "Black", 26)

    val parser = SpelExpressionParser()
    val expression = parser.parseExpression("age > 18 && first_name == 'Tom'")
    val result = expression.getValue(person, Boolean::class.java)

    println("##################### $result")

    return ResponseEntity(result, HttpStatus.OK)
}

主要关注JSON属性名和成员变量名,它们是不同的。而且我的 SpEL 表达式至少应该与 JSON 字段名称一起使用。 但是,它仅适用于成员变量名称(使用

firstName
但也应与
first_name
一起使用)。
对于
first_name
会抛出一个异常,告知在类型
first_name
中找不到
Person

我尝试创建 StandardEvaluationContext() 并在其中添加一个 JsonPropertyAccessor(),希望这样可以解决问题。 但是在调试时我注意到它最终被删除了,因为它只接受

String
JsonNode
JsonWrapper
作为类型。我的
Person
显然不是其中之一。

有什么方法可以实现我想要的行为吗?
它应该能够在嵌套对象上使用它并使用

@JsonProperty
注释来获取属性的正确名称。
最后,表达式将通过请求中的查询参数作为字符串提供。所以它也应该是用户友好的表达方式。

json spring kotlin jackson spring-el
1个回答
0
投票

我的 SpEL 表达式至少应该与 JSON 字段名称一起工作

不清楚你为什么会这样; SpEL 对 JSON 注释一无所知,它使用简单的属性访问器来访问字段。

您需要创建一个自定义属性访问器来解析字段上的注释并进行映射。

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