我有这样的东西:
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(),希望这能奏效。但是在调试时,我注意到它最终被删除了,因为它只接受String
,JsonNode
和JsonWrapper
作为类型。我的Person
显然不是其中之一。
有什么方法可以实现我想要的行为吗?
它应该能够在嵌套对象上使用它,并使用@JsonProperty
注解来获得属性的正确名称。
最后,表达式将通过请求中的查询参数以String形式提供。因此,它也应该是用户友好的关于表达。
1条答案
按热度按时间nzkunb0c1#
我的SpEL表达式应该至少可以与JSON字段名一起使用
不清楚你为什么会这样想;SpEL对JSON注解一无所知,它使用一个简单的属性访问器来访问字段。
您将需要创建一个自定义属性访问器来解析字段上的注解并进行Map。