Gostaria de enviar solicitações http com um valor em minúsculas, onde na variável de caminho, o valor é obtido de um Enum com valores em maiúsculas.
Em um código muito simples:
@HttpExchange(accept = "application/json")
public interface FooHttpExchange {
@GetExchange("/api/1.1/{day}/dosomething")
String doSomethingWithDayOfWeek(@PathVariable("day") Day day);
com o Enum:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Como você pode ver, todos os valores da enumeração estão em letras maiúsculas, para respeitar as convenções Java sobre enumeração.
Mas também obtenho os Enums de bibliotecas de terceiros. Não posso alterar o conteúdo do Enum.
Eu esperaria enviar isso como uma solicitação (tomando segunda-feira como exemplo):
http://example.com/api/1.1/monday/dosomething
Infelizmente, ele está enviando isto:
http://example.com/api/1.1/MONDAY/dosomething
E no lado do servidor, há uma análise, ou seja, ele espera coisas em letras minúsculas.
A solicitação falha
Se eu alterasse a enumeração para letras minúsculas, poderia confirmar que a solicitação estaria funcionando.
E às vezes, obtenho o Enum diretamente de uma biblioteca de terceiros, onde não posso alterar o código.
No entanto, isso quebra a convenção de enumeração do Java que exige que elas sejam colocadas em letras maiúsculas no código.
Como ter a enumeração Java em letras maiúsculas, mas poder enviá-la em letras minúsculas ao enviar a solicitação http?
Enum#toString
eString#toLowercase
Vamos configurar um cliente de interface HTTP para converter valores da enumeração Day em strings em minúsculas.
Registre um bean Converter que acessa o nome do enum e depois converte para strings em minúsculas.
O Spring Boot detecta beans Converter e os registra em um ConversionService. Um cliente de interface HTTP invoca um ConversionService para formatar valores de entrada como strings. No entanto, o ConversionService padrão usado por um cliente de interface HTTP não é o ConversionService configurado pelo Spring Boot. Você deve definir o ConversionService no cliente de interface HTTP:
Quebre a convenção Java e use valores de enumeração em minúsculas. Convenções são apenas... convenções, que podem ser quebradas se necessário.
Se quebrar essa convenção específica não for possível por razões de API/políticas/organizacionais, introduza outro tipo de enumeração,
LowerCaseDay
, que pode ser facilmente convertido de e paraDay
.