Konvertierung von JSON zu Enum-Typ mit @RequestBody
Ich habe einen master-enum-Klasse, die im wesentlichen eine Klassendefinition für eine Art von Objekt. Zum Beispiel ist es in etwa so aussieht wie das unten stehende Beispiel:
public enum ColorDefinition
{
private String abbrev;
private String color;
private Class colorClass;
RED("RD", "Red", Red.class),
GREEN("GN", "Green", Green.class),
BLUE("BL", "Blue", Blue.class)....
}
Ich versuche, eine post-Anforderung aus einem Javascript-Modell, dass sendet eine Zuordnung im Körper wie
{Rot : 255, Grün : 0, Blau: 0}
Um eine Feder gesteuert Endpunkt, der verwendet
@RequestMapping(value = "v1/color/EnableColors", method = RequestMethod.POST)
@ResponseBody
public ResponseObject enableColors(@RequestBody Map<ColorDefinition, Integer> colorMapping)
Denen bekomme ich folgende Fehlermeldung:
Kann nicht konstruieren, Karte Schlüssel ColorDefinition aus der Zeichenfolge "Rot": nicht eine gültige Darstellung: Kann nicht konstruieren, Karte Schlüssel ColorDefinition aus der Zeichenfolge "Rot": nicht einer der Werte für Enum-Klasse
Was mache ich hier falsch? Brauche ich eine andere Methode in der enum-Klasse, um richtig wandeln die eingehenden enum-Wert? Sollte es sein, mit einem anderen Wert aus der enum - (ich habe versucht, Sie ohne Erfolg)? Jede Hilfe ist willkommen, wie es scheint, sollte dies möglich sein, um automatisch konvertiert die ankommenden Werte, ich kann einfach nicht herausfinden!
- Konntest du einen workaround finden? Ich habe ein ähnliches problem und weiß nicht, was zu tun ist..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Fehlermeldung erklärt, was falsch ist: es gibt keine definition für
Red
innenColorDefinition
. Der Fall übereinstimmen muss; die enum-Werte sind case-sensitive. Der Schlüssel in deinem JSON werden müssenRED
,GREEN
, undBLUE
.Intern Spring nutzt
valueOf
um die enum-Darstellung von String. Bei der Deserialisierung wirdColorDefinition.valueOf("Red")
wirft einenIllegalArgumentException
weil es keine definition fürRed
imColorDefinition
. Diese Ausnahme abgefangen wird, indem der Frühling, und das ist, warum Sie eine Fehlermeldung sehen. AllerdingsColorDefinition.valueOf("RED")
zurückColorDefinition.RED
da gibt es eine definition fürRED
imColorDefinition
.Wenn Sie behandeln müssen, mixed-case (Rot), können Sie etwas wie das hier tun: