【需求】 在前端性别显示“男 / 女”,而数据库中存储的是“1 / 0”,对应的 Pojo 也是使用的 Integer 类型,如何实现?
    【实现方式】 方式一:通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略
    方式二:使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理 【Pojo 类】

    • @JsonDeserialize 是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。 需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。 - @JsonSerialize 是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。 需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。

      1. @Data
      2. @NoArgsConstructor
      3. @AllArgsConstructor
      4. public class Person implements Serializable {<!-- -->
      5. private static final long serialVersionUID = 4346092911489022673L;
      6. private Integer id;
      7. private String name;
      8. private Integer age;
      9. /**
      10. * 1 男,0 女
      11. */
      12. private Integer gender;
      13. @JsonDeserialize(using = GenderJsonDeserializer.class)
      14. public void setGender(Integer gender) {<!-- -->
      15. this.gender = gender;
      16. }
      17. @JsonSerialize(using = GenderJsonSerializer.class)
      18. public Integer getGender() {<!-- -->
      19. return gender;
      20. }
      21. }

    【GenderJsonDeserializer 类】
    其作用是处理参数,按照规则封装到指定的属性中,通过 p.getText() 获取参数。

    1. @Component
    2. @Slf4j
    3. public class GenderJsonDeserializer extends JsonDeserializer {
    4. @Override
    5. public Integer deserialize(JsonParser p, DeserializationContext ctxt)
    6. throws IOException, JsonProcessingException {
    7. if (ObjectUtils.isEmpty(p)) {
    8. return null;
    9. }
    10. int gender = 0;
    11. switch (p.getText()) {
    12. case "男":
    13. gender = 1;
    14. break;
    15. case "女":
    16. break;
    17. default:
    18. throw new RuntimeException("传入的性别为非法字符!");
    19. }
    20. log.info("【 GenderJsonDeserializer.deserialize() 】 p.getText() ==> "
    21. + p.getText() + ",转换后的结果 ==> " + gender);
    22. return gender;
    23. }
    24. }

    【GenderJsonSerializer 类】
    其作用是处理属性,按照规则封装到指定的参数中,通过value 获取属性,通过 gen.writeXxx() 方法写出参数。

    1. @Component
    2. @Slf4j
    3. public class GenderJsonSerializer extends JsonSerializer {
    4. @Override
    5. public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers)
    6. throws IOException {
    7. log.info("【 GenderJsonSerializer.serialize() 】 value ==> " + value);
    8. if (value.equals(1)) {
    9. gen.writeString("男");
    10. } else if (value.equals(0)) {
    11. gen.writeString("女");
    12. }
    13. }
    14. }

    【PersonController 类】
    用于测试 @PostConstruct 基本使用可以查看:

    1. @RestController
    2. @Slf4j
    3. public class PersonController {
    4. // 使用集合模拟数据库中数据存储
    5. private List&lt;Person> persons = new ArrayList&lt;>();
    6. // 用于初始化数据,@PostConstruct 注解标注的方法,在构造器执行之后自动执行,只会执行一次
    7. @PostConstruct
    8. public void init() {
    9. persons.add(new Person(1, "张三", 18, 1));
    10. persons.add(new Person(2, "李四", 33, 0));
    11. } @PostMapping("/save")
    12. public Person savePerson(@RequestBody Person person) {
    13. log.info("【 PersonController.savePerson() 】 person ===> " + person);
    14. persons.add(person);
    15. log.info("集合内容为 ===> " + persons);
    16. return person;
    17. }
    18. @GetMapping("/find")
    19. public Person findPersonById(Integer id) {
    20. Person p = null;
    21. for (Person person : persons) {
    22. if (person.getId().equals(id)) {
    23. p = person;
    24. log.info("【 PersonController.findPersonById() 】 查询结果为:person ===> " + person);
    25. }
    26. }
    27. return p;
    28. }
    29. }

    【测试】

    • 测试保存,即 Controller 中的 savePerson() image.png 控制台输出:

      1. GenderJsonDeserializer.deserialize() p.getText() ==> 男,转换后的结果 ==> 1
      2. PersonController.savePerson() person ===> Person(id=3, name=王五, age=88, gender=1)
      3. 集合内容为 ===> [Person(id=1, name=张三, age=18, gender=1),
      4. Person(id=2, name=李四, age=33, gender=0),
      5. Person(id=3, name=王五, age=88, gender=1)]
      6. GenderJsonSerializer.serialize() value ==> 1
    • 测试获取 image.png 控制台输出: ```java 【 PersonController.findPersonById() 】 查询结果为:person ===> Person(id=2, name=李四, age=33, gender=0)

    【 GenderJsonSerializer.serialize() 】 value ==> 0 ```