【需求】 在前端性别显示“男 / 女”,而数据库中存储的是“1 / 0”,对应的 Pojo 也是使用的 Integer 类型,如何实现?
【实现方式】 方式一:通过使用工具类,在请求进入前,或响应前对参数进行处理,然后进行封装,此方法略
方式二:使用 @JsonDeserialize 和 @JsonSerialize 注解对在序列化和反序列化时对参数进行处理 【Pojo 类】
@JsonDeserialize 是在反序列化时,所以就是对参数进行封装,故到的是 setXxxx() 方法,所以需要将注解添加到对应的 set 方法上,若使用了 Lombok 需要自己定义相应的 set 方法。 需要使用 using 属性指定处理参数的类,该类需要继承 JsonDeserializer 类,并重写 deserialize()。 - @JsonSerialize 是在序列化时,所以需要获取数据,那么需要使用到 getXxxx() 方法,故需要将注解添加到对应的 get 方法上,若使用了 Lombok 需要自己定义相应的 get 方法。 需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。
@Data@NoArgsConstructor@AllArgsConstructorpublic class Person implements Serializable {<!-- -->private static final long serialVersionUID = 4346092911489022673L;private Integer id;private String name;private Integer age;/*** 1 男,0 女*/private Integer gender;@JsonDeserialize(using = GenderJsonDeserializer.class)public void setGender(Integer gender) {<!-- -->this.gender = gender;}@JsonSerialize(using = GenderJsonSerializer.class)public Integer getGender() {<!-- -->return gender;}}
【GenderJsonDeserializer 类】
其作用是处理参数,按照规则封装到指定的属性中,通过 p.getText() 获取参数。
@Component@Slf4jpublic class GenderJsonDeserializer extends JsonDeserializer {@Overridepublic Integer deserialize(JsonParser p, DeserializationContext ctxt)throws IOException, JsonProcessingException {if (ObjectUtils.isEmpty(p)) {return null;}int gender = 0;switch (p.getText()) {case "男":gender = 1;break;case "女":break;default:throw new RuntimeException("传入的性别为非法字符!");}log.info("【 GenderJsonDeserializer.deserialize() 】 p.getText() ==> "+ p.getText() + ",转换后的结果 ==> " + gender);return gender;}}
【GenderJsonSerializer 类】
其作用是处理属性,按照规则封装到指定的参数中,通过value 获取属性,通过 gen.writeXxx() 方法写出参数。
@Component@Slf4jpublic class GenderJsonSerializer extends JsonSerializer {@Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializers)throws IOException {log.info("【 GenderJsonSerializer.serialize() 】 value ==> " + value);if (value.equals(1)) {gen.writeString("男");} else if (value.equals(0)) {gen.writeString("女");}}}
【PersonController 类】
用于测试 @PostConstruct 基本使用可以查看:
@RestController@Slf4jpublic class PersonController {// 使用集合模拟数据库中数据存储private List<Person> persons = new ArrayList<>();// 用于初始化数据,@PostConstruct 注解标注的方法,在构造器执行之后自动执行,只会执行一次@PostConstructpublic void init() {persons.add(new Person(1, "张三", 18, 1));persons.add(new Person(2, "李四", 33, 0));} @PostMapping("/save")public Person savePerson(@RequestBody Person person) {log.info("【 PersonController.savePerson() 】 person ===> " + person);persons.add(person);log.info("集合内容为 ===> " + persons);return person;}@GetMapping("/find")public Person findPersonById(Integer id) {Person p = null;for (Person person : persons) {if (person.getId().equals(id)) {p = person;log.info("【 PersonController.findPersonById() 】 查询结果为:person ===> " + person);}}return p;}}
【测试】
测试保存,即 Controller 中的 savePerson()
控制台输出:【 GenderJsonDeserializer.deserialize() 】 p.getText() ==> 男,转换后的结果 ==> 1【 PersonController.savePerson() 】 person ===> Person(id=3, name=王五, age=88, gender=1)集合内容为 ===> [Person(id=1, name=张三, age=18, gender=1),Person(id=2, name=李四, age=33, gender=0),Person(id=3, name=王五, age=88, gender=1)]【 GenderJsonSerializer.serialize() 】 value ==> 1
测试获取
控制台输出:
```java
【 PersonController.findPersonById() 】 查询结果为:person ===> Person(id=2, name=李四, age=33, gender=0)
【 GenderJsonSerializer.serialize() 】 value ==> 0 ```
