본문 바로가기
Spring

[Spring] @RequestBody를 사용하여 Entity로 변환시 enum 타입 Mapping

by 임채훈 2020. 10. 24.

재미삼아 Slack Bot을 활용한 API를 개발하면서 작성하는 글이다.

 

아래의 Controller Method 는 Slack Bot의 Event Receive Endpoint로 만든 메소드이다.

간단하게는 Post 요청을 받아 @RequestBody 어노테이션으로 form data를 EventReceiveMessage로 받는다.

@RestController
@RequestMapping(value = "/event")
public class EventController {
    @PostMapping(value = "/receive")
    public void receive(
            @RequestBody EventReceiveMessage message) {

    }
}

 

해당 메소드에 다음과 같은 Json 형태의 form data가 전달된다.

{
  "token": "...",
  "team_id": "...",
  "api_app_id": "...",
  "event": {
    "client_msg_id": "...",
    "type": "app_mention",
    "text": "...",
    "user": "...",
    "ts": "...",
    "team": "...",
    "blocks": [
      ...
    ],
    "channel": "...",
    "event_ts": "..."
  }
}

 

위 Json data를 Entity로 매핑하기 위하여 아래와 같은 EventReceiveMessage 클래스를 만들었다.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class EventReceiveMessage {
    @JsonProperty("token")
    private String token;

    @JsonProperty("team_id")
    private String teamId;

    @JsonProperty("api_app_id")
    private String apiAppId;

    @JsonProperty("event")
    private EventDetail event;

    ...
}
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class EventDetail {
    @JsonProperty("client_msg_id")
    private String clientMsgId;

    @JsonProperty("type")
    private EventType type;

    @JsonProperty("text")
    private String text;
    
    ...
}
public enum EventType {
    APP_MENTION
}

 

그리고 String 형태의 type 파라미터를 enum 으로 변환하기 위하여

아래와 같은 방법으로 String Type의 데이터를 Enum Type으로 변환해주는 Converter를 만들었는데 효과가 없었다.

@Component
public class EventTypeConverter implements Converter<String, EventType> {
    @Override
    public EventType convert(String s) {
        return EventType.valueOf(s.toUpperCase());
    }
}

 

레퍼런스를 찾아본 결과 아래와같이 매핑을 하고자하는 Enum 클래스에 @JsonCreator 어노테이션을 사용하여 Converter와 같은 방법으로 Enum을 변환해주는 메소드를 만들어주면 된다.

public enum EventType {
    APP_MENTION;

    @JsonCreator
    public static EventType from(String s) {
        return EventType.valueOf(s.toUpperCase());
    }
}

댓글