我想发送具有小写值的 http 请求,其中在路径变量中,该值取自具有大写值的枚举。
非常简单的代码:
@HttpExchange(accept = "application/json")
public interface FooHttpExchange {
@GetExchange("/api/1.1/{day}/dosomething")
String doSomethingWithDayOfWeek(@PathVariable("day") Day day);
使用枚举:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
如您所见,枚举的所有值都是大写的,以遵守 Java 枚举的约定。
但我也确实从第三方库中获取了枚举。我无法更改枚举的内容。
我希望将其作为请求发送(以星期一为例):
http://example.com/api/1.1/monday/dosomething
不幸的是,它发送的是这个:
http://example.com/api/1.1/MONDAY/dosomething
在服务器端,有一个解析过程,也就是说,它期望内容是小写的。
请求失败
如果我将枚举改为完全小写,我就可以确认请求正在起作用。
有时,我直接从第三方库中获取枚举,在那里我无法更改代码。
然而,这违反了 Java 枚举约定,即在代码中将它们设为大写。
如何将 Java 枚举设为大写,但在发送 http 请求时能够将其发送为小写?
Enum#toString
和String#toLowercase
让我们配置一个 HTTP 接口客户端,将 Day 枚举的值转换为小写字符串。
注册一个 Converter bean,访问枚举的名称,然后转换为小写字符串。
Spring Boot 会检测 Converter Bean 并将其注册到 ConversionService 中。HTTP 接口客户端会调用 ConversionService 将输入值格式化为字符串。但是,HTTP 接口客户端使用的默认 ConversionService 并非 Spring Boot 配置的 ConversionService。您必须在 HTTP 接口客户端中设置 ConversionService:
打破 Java 惯例,使用小写的枚举值。惯例只是……惯例,必要时可以打破。
如果由于 API/政治/组织原因而无法打破这一特定约定,则引入另一种枚举类型,
LowerCaseDay
可以轻松地与 相互转换Day
。