SpringBoot 는 하위 클래스 의 반 직렬 화 예제 코드 를 실현 합 니 다.

목표.
SpringBoot 인터페이스 에서 우 리 는 보통@RequestBody 류 주석 으로 반 직렬 화 대상 이 필요 하지만 여러 개의 하위 클래스 가 존재 하 는 상황 에서 일반적인 반 직렬 화 는 수 요 를 만족 시 키 지 못 합 니 다.예 를 들 어:
우 리 는 시험 지 를 표시 하 는 데 사용 되 는 클래스 Exam 이 있 습 니 다.

@Data
public class Exam {

 private String name;
 private List<Question> questions;
}
여기 서 Question 은 비교적 특수 하 다.Question 자 체 는 추상 적 인 유형 으로 통용 되 는 방법 을 제공 했다.실제 서브 클래스 는 단일 선택 문제,다 중 선택 문제,판단 문제 등 여러 가지 상황 이 있다.

이루어지다
Sprint Boot 에 내 장 된 직렬 화 는 Jackson 을 사용 합 니 다.문 서 를 찾 아 보 니 Jackson 은@JSonTypeInfo 와@JSonSubTypes 라 는 두 개의 주 해 를 제공 하고 조합 하여 사용 합 니 다.지정 한 필드 값 에 따라 구체 적 인 하위 클래스 유형 을 지정 할 수 있 습 니 다.
이 몇 가지 종류의 실제 코드 는 다음 과 같다.
추상 기본 질문:

@Data
@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.EXISTING_PROPERTY,
  property = "type",
  visible = true)
@JsonSubTypes({
  @JsonSubTypes.Type(value = SingleChoiceQuestion.class, name = Question.SINGLE_CHOICE),
  @JsonSubTypes.Type(value = MultipleChoiceQuestion.class, name = Question.MULTIPLE_CHOICE),
  @JsonSubTypes.Type(value = TrueOrFalseQuestion.class, name = Question.TRUE_OR_FALSE),
})
public abstract class Question {

 protected static final String SINGLE_CHOICE = "single_choice";
 protected static final String MULTIPLE_CHOICE = "multiple_choice";
 protected static final String TRUE_OR_FALSE = "true_or_false";

 protected String type;
 protected String content;
 protected String answer;

 protected boolean isCorrect(String answer) {
  return this.answer.equals(answer);
 }
}
판단 문제 TrueOrFalseQuestion:

@Data
@EqualsAndHashCode(callSuper = true)
public class TrueOrFalseQuestion extends Question {

  public TrueOrFalseQuestion() {
    this.type = TRUE_OR_FALSE;
  }
}
선택 문제 ChoiceQuestion:

@Data
@EqualsAndHashCode(callSuper = true)
public abstract class ChoiceQuestion extends Question {

  private List<Option> options;

  @Data
  public static class Option {
    private String code;
    private String content;
  }
}
단일 선택 문제 Single ChoiceQuestion:

@Data
@EqualsAndHashCode(callSuper = true)
public class SingleChoiceQuestion extends ChoiceQuestion {

  public SingleChoiceQuestion() {
    this.type = SINGLE_CHOICE;
  }
}
다 중 선택 문제 Multiple ChoiceQuestion:

@Data
@EqualsAndHashCode(callSuper = true)
public class MultipleChoiceQuestion extends ChoiceQuestion {

  public MultipleChoiceQuestion() {
    this.type = MULTIPLE_CHOICE;
  }

  @Override
  public void setAnswer(String answer) {
    this.answer = sortString(answer);
  }

  @Override
  public boolean isCorrect(String answer) {
    return this.answer.equals(sortString(answer));
  }

  private String sortString(String str) {
    char[] chars = str.toCharArray();
    Arrays.sort(chars);
    return String.valueOf(chars);
  }
}
테스트
이제 테스트 를 해 보도 록 하 겠 습 니 다.
인 터 페 이 스 를 정의 합 니 다.@RequestBody 를 사용 하여 Exam 대상 을 전송 하고 분석 결 과 를 되 돌려 줍 니 다.

@RequestMapping(value = "/exam", method = RequestMethod.POST)
public List<String> parseExam(@RequestBody Exam exam) {
  List<String> results = new ArrayList<>();
  results.add(String.format("Parsed an exam, name = %s", exam.getName()));
  results.add(String.format("Exam has %s questions", exam.getQuestions().size())) 
  
  List<String> types = new ArrayList<>();
  for (Question question : exam.getQuestions()) {
    types.add(question.getType());
  }
  results.add(String.format("Questions types: %s", types.toString()));
  return results;
}
프로젝트 가 달 려 서 인 터 페 이 스 를 호출 하여 테스트 합 니 다.

curl -X POST \
 http://127.0.0.1:8080/exam/ \
 -H 'Content-Type: application/json' \
 -d '{
  "name":"    ",
  "questions": [
    {
      "type": "single_choice",
      "content": "   ",
      "options": [
        {
          "code":"A",
          "content": "  A"
        },{
          "code":"B",
          "content": "  B"
        }],
      "answer": "A"
    },{
      "type": "multiple_choice",
      "content": "   ",
      "options": [
        {
          "code":"A",
          "content": "  A"
        },{
          "code":"B",
          "content": "  B"
        }],
      "answer": "AB"
    },{
      "type": "true_or_false",
      "content": "   ",
      "answer": "True"
    }]
}'
인 터 페 이 스 는 다음 과 같 습 니 다:

[
  "Parsed an exam, name =     ",
  "Exam has 3 questions",
  "Questions types: [single_choice, multiple_choice, true_or_false]"
]
여기 서 서로 다른 유형의 question,type 필드 를 정확하게 읽 을 수 있 습 니 다.이 는 반 직렬 화 과정 에서 구체 적 인 하위 클래스 에 대응 하 는 클래스 를 호출 하여 예화 한 것 임 을 나타 냅 니 다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기