3

基本的にオブジェクトのタイプのクラス定義であるマスター列挙型クラスがあります。たとえば、次の例のようになります。

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)....
}


{Red : 255, Green : 0, Blue: 0}などの本文でマッピングを送信する Javascript モデルからポスト リクエストを設定しようとして

います。

@RequestMapping(value = "v1/color/EnableColors", method = RequestMethod.POST)
@ResponseBody
public ResponseObject enableColors(@RequestBody Map<ColorDefinition, Integer> colorMapping)

次のエラーメッセージが表示されます。
文字列「赤」からタイプ ColorDefinition の Map キーを構築できません: 有効な表現ではありません: 文字列「赤」からタイプ ColorDefinition のマップキーを構築できません: Enum クラスの値の 1 つではありません

。私はここで間違っていますか?受信した列挙型の値を適切に変換するには、列挙型クラスに他のメソッドが必要ですか? 列挙型の別の値を使用する必要がありますか (試してみましたが成功しませんでした)? 任意の助けをいただければ幸いです。これは、入力値を自動的に変換することが可能であるように思われますが、私にはわかりません!

4

2 に答える 2

5

エラーメッセージは、何が問題なのかを説明しています: there is no definition for Redinside ColorDefinition. 大文字と小文字が一致する必要があります。列挙値は大文字と小文字が区別されます。JSON のキーは、、、および でREDある必要があります。GREENBLUE

内部的に、Spring はvalueOf文字列の列挙型表現を取得するために使用します。inの定義がないため、逆シリアル化中にColorDefinition.valueOf("Red")がスローされます。この例外は Spring によってインターセプトされるため、エラー メッセージが表示されます。ただし、inの定義があるため、が返されます。IllegalArgumentExceptionRedColorDefinitionColorDefinition.valueOf("RED")ColorDefinition.REDREDColorDefinition

于 2013-07-01T15:40:18.070 に答える
0

大文字と小文字が混在する (赤) を処理する必要がある場合は、次のようにすることができます。

  public static class MyConverter extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
      setValue(ColorDefinition.valueOf(text.toUpperCase()));
    }    
  }

  @InitBinder
  public void initBinder(WebDataBinder binder)
  {
    binder.registerCustomEditor(ColorDefinition.class, new MyConverter ());
  }
于 2013-07-01T15:47:20.317 に答える