我有一个Enum,我想用自定义属性序列化它。它在我的测试中工作,但当我发出请求时就不行了。
Enum应该使用JsonValue
进行映射enum class PlantProtectionSortColumn(
@get:JsonValue val propertyName: String,
) {
NAME("name"),
REGISTRATION_NUMBER("registrationNumber");
}
在test中,小写字母正常工作。
class PlantProtectionSortColumnTest : ServiceSpec() {
@Autowired
lateinit var mapper: ObjectMapper
data class PlantProtectionSortColumnWrapper(
val sort: PlantProtectionSortColumn,
)
init {
// this works
test("Deserialize PlantProtectionSortColumn enum with custom name ") {
val json = """
{
"sort": "registrationNumber"
}
"""
val result = mapper.readValue(json, PlantProtectionSortColumnWrapper::class.java)
result.sort shouldBe PlantProtectionSortColumn.REGISTRATION_NUMBER
}
// this one fails
test("Deserialize PlantProtectionSortColumn enum with enum name ") {
val json = """
{
"sort": "REGISTRATION_NUMBER"
}
"""
val result = mapper.readValue(json, PlantProtectionSortColumnWrapper::class.java)
result.sort shouldBe PlantProtectionSortColumn.REGISTRATION_NUMBER
}
}
}
但是在控制器中,当我用小写发送请求时,我得到400。但是当请求与enum名称匹配时,它可以工作,但是返回的响应是小写的。所以Spring不使用objectMapper只用于请求,在响应中使用它。
private const val RESOURCE_PATH = "$API_PATH/plant-protection"
@RestController
@RequestMapping(RESOURCE_PATH, produces = [MediaType.APPLICATION_JSON_VALUE])
class PlantProtectionController() {
@GetMapping("/test")
fun get(
@RequestParam sortColumn: PlantProtectionSortColumn,
) = sortColumn
}
我相信kqr的答案是正确的,你需要配置转换器,而不是JSON反序列化器。
它可能看起来像:
@Component
class StringToPlantProtectionSortColumnConverter : Converter<String, PlantProtectionSortColumn> {
override fun convert(source: String): PlantProtectionSortColumn {
return PlantProtectionSortColumn.values().firstOrNull { it.propertyName == source }
?: throw NotFoundException(PlantProtectionSortColumn::class, source)
}}
在您的端点中,您不是解析json主体,而是查询参数,这不是json格式。