关于@JsonProperty,@NotNull,@JsonIgnore的具体使用

 更新时间:2022年08月30日 09:45:04   作者:peng-peng-  
这篇文章主要介绍了关于@JsonProperty,@NotNull,@JsonIgnore的具体使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前情摘要

上回说道,小明同学用@JsonProperty解决了,在接口通讯中的Json反序列化问题。

经过研究,小明发现@JsonProperty在特定场景下,还有更人性化的作用。

并且在项目中相继使用了@JsonIgnore和@NotNull两兄弟。下面继续场景分析。

场景分析一

小明做了一个web表单,用来填写并保存数据,后台写restful接口接收数据并保存。

写完之后让老大review的时候,自信满满的小明,又收到了很多comment。

小明看到了这些comment发现确实有不足之处,比如表单里的有些数据是必须不为空的,虽然在页面上加上了强校验(Js校验),但是后台接口是对外开放的restful接口,别人不走页面直接访问接口存储数据,这时候页面的校验就显得很尴尬了,小明又想这好办啊,直接拿接收到的参数进行非空判断不就行了么,其实也是可以的,但是小明在研究@JsonProperty的时候发现@NotNull正好解决这个问题。

代码展示如下:

Student类

public class Student {
   
   @JsonProperty(value="real_name")
   private String name ;
   
   @NotNull(message="idcard is not null")
   private String idCard;
   
   
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getIdCard() {
      return idCard;
   }
   public void setIdCard(String idCard) {
      this.idCard = idCard;
   }
   
   
}

StudentController.java

(注:这里为了测试方便未按照标准的restApi书写,如需学习标准的restful接口风格请移步百度。请见谅)

@RestController
public class StudentController {
 
   @RequestMapping(value="/student",method=RequestMethod.POST)
   public Student save(@RequestBody @Valid Student student) {
      return student;
   }
}

Postman测试如下:

(条件是:正常输入real_name和idCard,返回结果正常)

Postman测试结果如下

(条件:只写real_name,不填写idCard。报错)

注意接口书写时,用@RequestBody接收输入参数时,这时候也需要匹配你预先定义的@JsonProperty的值。

参考real_name.并且,在参数前需要加上@Valid,你定义的@NotNull校验才会生效。

@JsonProperty(value="real_name")
private String name ;

场景分析二

idCard为用户的敏感信息,在接口返回数据中不能展示出来,以免用户敏感信息直接暴露在外。

这时候,小明想到了另外一个注解,@JsonIgnore,在Student对象序列化为json数据的返回的时候,忽略该属性。

代码及测试如下:

 @JsonProperty(value="real_name")
   private String name ;
   
   @JsonIgnore
   private String idCard;

 

Postman测试如下

(条件:正常输入real_name和idCard,观察返回数据,只包含real_name)

场景分析三

在场景二中提到使用@JsonIgnore可以让接口在返回数据的时候不序列化一些属性。

但是小明又想了,若场景一和场景二结合使用,及在用户输入表单保存数据的时候,某个字段不能为空,并且返回数据的时候又不能包含该属性,是不是可以使用组合注解@JsonIngore和@NotNull呢,

代码和测试结果如下:

 @JsonProperty(value="real_name")
   private String name ;
   
   @JsonIgnore
   @NotNull(message="idcard is not null")
   private String idCard;

Postman测试结果如下

(条件:idCard及为上述特殊字段,结果报错)

经过尝试,小明想到了如下解决方案,代码及测试结果如下:

   @JsonProperty(value="real_name")
   private String name ;
   
   @JsonProperty(access=Access.WRITE_ONLY)
   @NotNull(message="idcard is not null")
   private String idCard;

Postman测试结果如下

(条件:用JsonProperty代替JsonIgnore)

成功实现需求。

场景分析四

由于小明公司秉承尽最大努力少使用第三方的资源的原因,项目中关于JsonObject相关的jar都是使用的org.json,并未使用阿里的fastjson,如果项目使用的是fastjson,再使用上述的注解就不起作用了,它有自己的一套注解来解决上述问题,

如:@JSONField,具体可参考com.alibaba.fastjson.annotation包。感兴趣的可以查一下。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis-Plus条件构造器select方法返回指定字段方式

    Mybatis-Plus条件构造器select方法返回指定字段方式

    这篇文章主要介绍了Mybatis-Plus条件构造器select方法返回指定字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • eclipse 中的javac命令与java命令

    eclipse 中的javac命令与java命令

    这篇文章主要介绍了eclipse javac命令与java命令的相关资料,需要的朋友可以参考下
    2016-12-12
  • Java在PDF中添加表格过程详解

    Java在PDF中添加表格过程详解

    这篇文章主要介绍了Java在PDF中添加表格过程详解,本文将介绍通过Java编程在PDF文档中添加表格的方法。添加表格时,可设置表格边框、单元格对齐方式、单元格背景色、单元格合并、插入图片、设置行高、列宽、字体、字号等,需要的朋友可以参考下
    2019-07-07
  • Java数学工具类MathUtil详解

    Java数学工具类MathUtil详解

    这篇文章主要为大家详细介绍了Java数学工具类MathUtil的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Spring Boot ORM 框架JPA使用与连接池 Hikari详解

    Spring Boot ORM 框架JPA使用与连接池 Hikari详解

    这篇文章主要介绍了SpringBoot ORM框架JPA与连接池Hikari,主要就是介绍JPA 的使用姿势,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • Java如何生成随机数不了解下吗

    Java如何生成随机数不了解下吗

    我们在学习 Java 基础时就知道可以生成随机数,可以为我们枯燥的学习增加那么一丢丢的乐趣,本文就来和大家介绍Java生成随机数的常用方法,需要的可以参考下
    2023-08-08
  • 使用IDEA配置Maven搭建开发框架ssm教程

    使用IDEA配置Maven搭建开发框架ssm教程

    这篇文章主要为大家详细介绍了使用IDEA配置Maven搭建开发框架ssm教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Spring框架开发scope作用域分析总结

    Spring框架开发scope作用域分析总结

    这篇文章主要介绍了Spring框架开发中scope作用域的分析总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-09-09
  • Java实现自定义LinkedList类的示例代码

    Java实现自定义LinkedList类的示例代码

    LinkedList类跟ArrayList类不同,它通过指针以及结点的操作对链表进行增删改查。本文就来和大家分享下Java如何为实现自定义LinkedList类,需要的可以参考一下
    2022-08-08
  • spring security4 添加验证码的示例代码

    spring security4 添加验证码的示例代码

    本篇文章主要介绍了spring security4 添加验证码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02

最新评论