最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)子類的反序列化示例代碼

 更新時間:2019年08月06日 10:51:00   作者:別拿豆包不當(dāng)干糧  
這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)子類的反序列化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

目標(biāo)

在SpringBoot接口中,我們一般用@RequestBody類注解需要反序列化的對象,但是當(dāng)存在多個子類的情況下,常規(guī)的反序列化不能滿足需求,比如:

我們有一個類Exam用于表示一張試卷:

@Data
public class Exam {

 private String name;
 private List<Question> questions;
}

這里Question比較特殊,Question本身是一個抽象類,提供了一些通用的方法調(diào)用,實際子類有單選題、多選題、判斷題多種情況

實現(xiàn)

SprintBoot內(nèi)置的序列化是使用的Jackson,查閱文檔后發(fā)現(xiàn)Jackson提供了@JsonTypeInfo和@JsonSubTypes這兩個注解,搭配使用,可以根據(jù)指定的字段值來指定實例化中用到的具體的子類類型

這幾個類的實際代碼如下:

抽象基類Question:

@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;
  }
}

單選題SingleChoiceQuestion:

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

  public SingleChoiceQuestion() {
    this.type = SINGLE_CHOICE;
  }
}

多選題MultipleChoiceQuestion:

@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對象,返回解析結(jié)果:

@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;
}

項目跑起來,調(diào)用接口測試一下:

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字段都能正確讀取,表明反序列化過程中確實是調(diào)用了具體子類對應(yīng)的類來進(jìn)行實例化的。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • mybatisplus自動填充屬性值的實現(xiàn)步驟

    mybatisplus自動填充屬性值的實現(xiàn)步驟

    MyBatis-Plus提供自動填充的功能,幫助自定設(shè)置這些字段的值,提升開發(fā)效率,本文就來介紹一下如何使用,感興趣的可以了解一下
    2023-12-12
  • Java調(diào)用商品詳情API的項目實踐

    Java調(diào)用商品詳情API的項目實踐

    在現(xiàn)代電子商務(wù)網(wǎng)站中,商品詳情API是一個重要的組件,本文就來介紹一下Java調(diào)用商品詳情API的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java編程簡單應(yīng)用

    Java編程簡單應(yīng)用

    本文主要介紹了三個簡單Java小程序———1、HelloWorld(HelloWorld的來源);2、輸出個人信息3、輸出特殊圖案。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • java實現(xiàn)簡單的搜索引擎

    java實現(xiàn)簡單的搜索引擎

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單的搜索引擎的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Spring Boot簡介與快速搭建詳細(xì)步驟

    Spring Boot簡介與快速搭建詳細(xì)步驟

    SpringBoot其本身沒有添加什么新的技術(shù),就是整合了一些現(xiàn)有的框架,并提供了一些默認(rèn)的配置,就是這些默認(rèn)的配置,極大的提高了我們的開發(fā)效率。這篇文章主要介紹了Spring Boot簡介與快速搭建,需要的朋友可以參考下
    2021-05-05
  • SpringMVC的處理器適配器-HandlerAdapter的用法及說明

    SpringMVC的處理器適配器-HandlerAdapter的用法及說明

    這篇文章主要介紹了SpringMVC的處理器適配器-HandlerAdapter的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Springboot項目Maven依賴沖突的問題解決

    Springboot項目Maven依賴沖突的問題解決

    使用Spring Boot和Maven進(jìn)行項目開發(fā)時,依賴沖突是一個常見的問題,本文就來介紹一下Springboot項目Maven依賴沖突的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 詳解Java如何獲取文件編碼格式

    詳解Java如何獲取文件編碼格式

    這篇文章主要介紹了詳解Java如何獲取文件編碼格式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java多線程中的單例模式兩種實現(xiàn)方式

    Java多線程中的單例模式兩種實現(xiàn)方式

    這篇文章主要介紹了Java多線程中的單例模式兩種實現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 帶你快速搞定java多線程(5)

    帶你快速搞定java多線程(5)

    這篇文章主要介紹了java多線程編程實例,分享了幾則多線程的實例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07

最新評論

山东| 长丰县| 牙克石市| 顺义区| 大新县| 麻城市| 望江县| 岳阳市| 安徽省| 襄城县| 孟村| 竹溪县| 商洛市| 岳西县| 天门市| 陆河县| 临高县| 色达县| 比如县| 如皋市| 江源县| 万荣县| 南投县| 郯城县| 峨眉山市| 长岭县| 松溪县| 南汇区| 正定县| 台州市| 汪清县| 墨玉县| 闸北区| 呼图壁县| 邵武市| 鄂伦春自治旗| 拜城县| 横峰县| 盖州市| 松潘县| 神农架林区|