[英]@RequestParam and mapping enum
我对枚举作为@RequestParam
有疑问。 在getRooms
方法中有两个枚举: Sort.Direction
和SourceFunding
。 Sort.Direction
是内置的 Spring 枚举,它可以完美地从 String 转换为 Enum:
http://address:port/all?sortDirection=ASC => OK
http://address:port/all?sortDirection=DESC => OK
但是当我打电话时
http://address:port/all?sourceFunding=PUBLIC_INSURANCE => ALWAYS ERROR.
我已阅读并测试过:
@RequestParam defaultvalue 不接受枚举值作为默认值
和许多其他没有效果。 我也尝试在我的枚举中模拟 Sort.Direction。
****** 编码 *******
错误:{“时间戳”:“2022-07-15T15:53:27.371+00:00”,“状态”:400,“错误”:“错误请求”,“消息”:“无法转换类型的值'java.lang.String' 到所需类型 'xxx.xxxxx.Leo.booking.SourceFunding';嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法从类型 [java.lang.String] 转换为类型 [ @org.springframework.web.bind.annotation.RequestParam xxx.xxxxx.Leo.booking.SourceFunding] 用于值“PUBLIC_INSURANCE”;嵌套异常是 java.lang.IllegalArgumentException:没有枚举常量 xxx.xxxxx.Leo.booking。 SourceFunding.'PUBLIC_INSURANCE'", "path": "/room/all" }
也可以是
参数值 [PRIVATE_INSURANCE] 与预期类型 [xxx.xxxxx.Leo.booking.SourceFunding (n/a)] 不匹配; 嵌套异常是 java.lang.IllegalArgumentException:参数值 [PRIVATE_INSURANCE] 与预期类型不匹配 [xxx.xxxxx.Leo.booking.SourceFunding (n/a)]
控制器:
@GetMapping(path = "/all")
public Page<Room> getRooms(@RequestParam(defaultValue = "0") Integer pageNumber,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(defaultValue = "id") String sortBy,
@RequestParam(defaultValue = "ASC") Sort.Direction sortDirection,
@RequestParam(required = false) Long departmentId,
@RequestParam(required = false) Long hospitalId,
@RequestParam(required = false) SourceFunding sourceFunding
) {...}
枚举:
public enum SourceFunding {
PUBLIC_INSURANCE,
PRIVATE_INSURANCE,
PAID_BY_CITIZENS,
PAID_BY_COMPANY,
CHARITY,
COLLECTIVE_FUNDING_FSS,
OTHER,
NONE;
}
更新1 - 这太疯狂了......
SourceFunding.valueOf(sourceFundingString); => Error 'No enum constant ...'
log.info("!! {}", Arrays.toString(SourceFunding.values())); => Return all enum's fields
在我看来,使用邮递员时,您的查询参数输入没有得到正确的值。 错误显示它在您的输入'PUBLIC_INSURANCE'
中有单引号。
Spring 使用Enum.valueOf(string)
来评估 queryParam 值。 如果我们使用'PUBLIC_INSURANCE'
,它将找不到任何对应的枚举。
您可以尝试通过console.log(pm.request.url.query)
在邮递员的tests
部分记录您的输入请求并检查您的输入是否正确。
通过单击View
-> Show Postman Console
可以看到 postman 中的控制台日志
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.