복붙노트

[SPRING] @RequestBody를 사용하여 JSON을 Enum 유형으로 변환

SPRING

@RequestBody를 사용하여 JSON을 Enum 유형으로 변환

기본적으로 객체 유형에 대한 클래스 정의 인 마스터 enum 클래스가 있습니다. 예를 들어 아래 예와 같이 보입니다.

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

Javascript 모델에서 게시 요청을 설정하려고합니다.이 모델은 다음과 같이 몸체에 매핑을 보냅니다. {빨간색 : 255, 녹색 : 0, 파란색 : 0} 스프링 제어 엔드 포인트에

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

내가 다음과 같은 오류 메시지가 나타납니다 : String "Red"에서 ColorDefinition 유형의 Map 키를 만들 수 없습니다. 유효한 표현이 아닙니다 : ColorDefinition 유형의 Map 키를 작성할 수 없습니다. String "Red": Enum 클래스의 값 중 하나가 아닙니다. 여기서 내가 뭘 잘못하고 있니? 들어오는 enum 값을 제대로 변환하려면 enum 클래스에 다른 메소드가 필요합니까? 열거 형에서 다른 값을 사용해야합니까? (나는 성공하지 못했습니다)? 어떤 도움을 주시면 감사하겠습니다. 자동으로 수신되는 값을 변환 할 수 있어야합니다. 알아낼 수 없습니다!

해결법

  1. ==============================

    1.오류 메시지는 무엇이 잘못되었는지 설명합니다. ColorDefinition 내부에 빨간색 정의가 없습니다. 사례가 일치해야합니다. 열거 형 값은 대소 문자를 구분합니다. JSON의 키는 RED, GREEN 및 BLUE이어야합니다.

    오류 메시지는 무엇이 잘못되었는지 설명합니다. ColorDefinition 내부에 빨간색 정의가 없습니다. 사례가 일치해야합니다. 열거 형 값은 대소 문자를 구분합니다. JSON의 키는 RED, GREEN 및 BLUE이어야합니다.

    내부적으로 Spring은 valueOf를 사용하여 String의 enum 표현을 가져옵니다. deserialization하는 동안 ColorDefinition.valueOf ( "Red")는 ColorDefinition에 Red에 대한 정의가 없기 때문에 IllegalArgumentException을 발생시킵니다. 이 예외는 Spring에 의해 가로 채기 때문에 오류 메시지가 표시됩니다. 그러나 ColorDefinition.valueOf ( "RED")는 ColorDefinition에 RED에 대한 정의가 있으므로 ColorDefinition.RED를 반환합니다.

  2. ==============================

    2.대소 문자를 혼합하여 처리해야하는 경우 (Red) 다음과 같이 할 수 있습니다.

    대소 문자를 혼합하여 처리해야하는 경우 (Red) 다음과 같이 할 수 있습니다.

      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 ());
      }
    
  3. from https://stackoverflow.com/questions/17408083/converting-json-to-enum-type-with-requestbody by cc-by-sa and MIT license