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

63lcw9qa  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(210)

我有这样的东西:

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,抛出一个异常,告诉在类型Person中找不到first_name
我尝试创建StandardEvaluationContext()并在那里添加一个JsonPropertyAccessor(),希望这能奏效。但是在调试时,我注意到它最终被删除了,因为它只接受StringJsonNodeJsonWrapper作为类型。我的Person显然不是其中之一。
有什么方法可以实现我想要的行为吗?
它应该能够在嵌套对象上使用它,并使用@JsonProperty注解来获得属性的正确名称。
最后,表达式将通过请求中的查询参数以String形式提供。因此,它也应该是用户友好的关于表达。

nzkunb0c

nzkunb0c1#

我的SpEL表达式应该至少可以与JSON字段名一起使用
不清楚你为什么会这样想;SpEL对JSON注解一无所知,它使用一个简单的属性访问器来访问字段。
您将需要创建一个自定义属性访问器来解析字段上的注解并进行Map。

相关问题