关于@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包。感兴趣的可以查一下。

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

(0)

相关推荐

  • Java序列化JSON丢失精度问题的解决方法(修复Long类型太长)

    目录 原因: 解决办法一: 解决办法(二): 总结 Java序列化JSON时long型数值,会出现精度丢失的问题. 原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值). 解决办法一: 使用ToStringSerializer的注解,让系统序列化时,保留相关精度 @JsonSerialize(using=ToStringSerializer.class) private Long createdBy; 上述方法需要在每个对象都配上该注

  • JsonProperty 的使用方法详解

    这篇文章主要介绍了JsonProperty 的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引入 依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> &l

  • java生成json实现隐藏掉关键属性

    目录 java生成json隐藏关键属性 因此解决方案如下 java实体转json忽略属性 java生成json隐藏关键属性 今天在工作中遇到一个这样的问题,当后端返回数据时一些关键信息或敏感信息并不想返回到前端,但是又懒得定义专用的DTO返回怎么办(强烈不推荐,最好定义专用的DTO返回),比如一张用户表有属性有用户名.密码.昵称.头像.性别.个人简介,用@ResponseBody生成json直接用户名和密码都输出到前台展示了,用户名和密码这两个属性怎么隐藏掉. 我们项目中使用的是Spring B

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

    目录 前情摘要 场景分析一 场景分析二 场景分析三 场景分析四 前情摘要 上回说道,小明同学用@JsonProperty解决了,在接口通讯中的Json反序列化问题. 经过研究,小明发现@JsonProperty在特定场景下,还有更人性化的作用. 并且在项目中相继使用了@JsonIgnore和@NotNull两兄弟.下面继续场景分析. 场景分析一 小明做了一个web表单,用来填写并保存数据,后台写restful接口接收数据并保存. 写完之后让老大review的时候,自信满满的小明,又收到了很多co

  • 关于.NET Attribute在数据校验中的应用教程

    前言 Attribute(特性)的概念不在此赘述了,相信有点.NET基础的开发人员都明白,用过Attribute的人也不在少数,毕竟很多框架都提供自定义的属性,类似于Newtonsoft.JSON中JsonProperty.JsonIgnore等 自定义特性 .NET 框架允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索.该信息根据设计标准和应用程序需要,可与任何目标元素相关. 创建并使用自定义特性包含四个步骤: 声明自定义特性 构建自定义特性 在目标程序元素上应用自定义特性 通过反

  • 关于@JsonProperty和@JSONField注解的区别及用法

    目录 @JsonProperty和@JSONField注解区别及用法 1. 目的 2. 区别 jsonField和jsonProperty注解的坑 @JSONField @JSONProperty @JsonProperty和@JSONField注解区别及用法 1. 目的 都是为了解决bean与json字段不一致问题,或者字段定义不符合前端所需要的标准 2. 区别 1.框架不同: @jsonProperty是 Jackson的包,而@jsonfield是fastjson的包 2.用法不同: (1

  • 由@NotNull注解引出的关于Java空指针的控制

    Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键."预防好过治疗"这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的

  • @NotEmpty、@NotBlank、@NotNull的区别

    在网上搜索的内容,大致如下: 验证框中@NotEmpty.@NotBlank.@NotNull乍一看还是容易弄混的.主要使用情况记录一下: @NotEmpty 用在集合类上面 @NotBlank 用在String上面 @NotNull    用在基本类型上 只有简单的结果,但是再更具体一点的内容就搜不到了,所以去看了看源码,发现了如下的注释: 1. @NotEmpty 复制代码 代码如下: /** * Asserts that the annotated string, collection,

  • spring 注解验证@NotNull等使用方法

    本文介绍了spring 注解验证@NotNull等使用方法,分享给大家,具体如下: 常用标签 @Null  被注释的元素必须为null @NotNull  被注释的元素不能为null @AssertTrue  被注释的元素必须为true @AssertFalse  被注释的元素必须为false @Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value)

  • 聊聊python dropna()和notnull()的用法区别

    定义一个DataFrame data = {'a':[1,2,3,NaN],'b':['l','k','j','k'],'c':['12r','45h','45u','456u']} frame1 = DataFrame(data) print(frame1) print('\n') print(frame1.dropna()) print('\n') print(frame1[frame1.notnull()]) 输出: 当未精确定位到某一列,但该列中存在空值时,dropna()会将空值所在行

  • 校验非空的注解@NotNull如何取得自定义的message

    目录 校验非空的注解@NotNull如何取得自定义的message 用法:定义一个全局异常处理 @NotNull 等注解的简单使用 2.3以前则不需要引入maven包 Controller层 附上 部分注解 校验非空的注解@NotNull如何取得自定义的message 由于项目表单需要校验字段过多,一个一个去判空太麻烦,所以用了@NotNull注解,字段为空会抛出MethodArgumentNotValidException异常. 接下来要取得@NotNull(message="自定义异常&qu

  • 解决get请求入参@NotNull验证不生效问题

    目录 get请求@NotNull验证不生效 解决办法 使用@NotEmpty,@NotBlank,@NotNull及@Valid注解校验请求参数 这里列举一下常用的注解 当校验不同过时,会返回对应的message描述 CreateUserRequest 实体类并添加校验注解 get请求@NotNull验证不生效 解决办法 在该方法的controller类上加@Validated 验证信息生效了 使用@NotEmpty,@NotBlank,@NotNull及@Valid注解校验请求参数 @NotE

随机推荐