专属目录
- 爪哇基础 之 @JsonIgnore 注解
- 前言
- 作用
- 使用
- 正常不使用注解写法
- pojo 实体类
- Example类
- Service 逻辑层
- Mapper 数据持久化层 (此处逆向工程都可生成)
- Controller 控制层
- 测试结果
- 添加使用注解后写法
- 修改后的实体类
- 添加注解后测试结果
- 注意⚠️
- 总结
爪哇基础 之 @JsonIgnore 注解
前言
日常Java开发时,会经常与前端开发、ios 或 安卓开发,进行数据交互,前面我们也说了使用json 序列化后交互,可是又有一个头疼的问题,那就是一般返回到前端的实体类中,是有一些属性不想暴露出去,比如 用户的密码,还有一些自增的ID等等一些不需要的信息。而有时候也有自身的原因,想偷懒不想专门写个 VO
、DTO
、PO
,可那些多余的字段前端又不需要,我们又该如何处理呢!
今天我们就来说下仅用一个注解,即可搞定以上问题!这个注解就是 —— @JsonIgnore
,它是 Jackson
注解包
下的一个注解!
具体 Jackson 如何使用,可点击查看!
爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化
作用
@JsonIgnore
的作用到底是什么呢!
它的作用就是在后端给前端数据的时候对后端发送出的json字符串能够发挥作用的一个注解,可以忽略不想传递给前台的属性或接口
如果不使用此注解的话,在json序列化时将java bean中的一些属性删除掉后,对于前端是不需要,可是我们后端操作的时候却是需要的,如 用户的密码字段,前端并不需要返回,但是后端操作逻辑处理,验证登录等等都是需要的,如果将属性删掉,就无法使用 set/get 方法,也就失去了对数据的操作!
使用
那@JsonIgnore
该如何使用呢?
下面我们来写一个简单的实例来清楚的看下效果!
正常不使用注解写法
pojo 实体类
User.java
package com.json.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @ClassName: User
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/5 17:55
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer sex;
private Integer status;
private Date date;
private static final long serialVersionUID = 1L;
}
Example类
UserExample.java
Example类
Mybatis 逆向工程直接生成
即可!
如果还不会逆向工程
的话,可查看以下文章,点击即可查看进一步学习!
IDEA 的 mybatis-generate 插件生成代码
Service 逻辑层
-
UserService.java
(接口)
package com.json.service;
import com.json.bean.User;
import java.util.List;
/**
* @ClassName: UserService
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/6 11:54
*/
public interface UserService {
List<User> getUserList();
}
-
UserServiceImpl.java
(接口实现类)
package com.json.service;
import com.json.bean.User;
import com.json.bean.UserExample;
import com.json.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @ClassName: UserServiceImpl
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/6 11:55
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getUserList() {
return userMapper.selectByExample(new UserExample());
}
}
Mapper 数据持久化层 (此处逆向工程都可生成)
-
UserMapper.java
(接口)
package com.json.mapper;
import com.json.bean.User;
import com.json.bean.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
List<User> selectByExample(UserExample example);
}
-
UserMapper.xml
映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.json.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.json.bean.User">
<id column="user_id" jdbcType="INTEGER" property="id"/>
<result column="user_username" jdbcType="VARCHAR" property="username"/>
<result column="user_password" jdbcType="VARCHAR" property="password"/>
<result column="user_age" jdbcType="INTEGER" property="age"/>
<result column="user_sex" jdbcType="INTEGER" property="sex"/>
<result column="user_status" jdbcType="INTEGER" property="status"/>
<result column="user_date" jdbcType="DATE" property="date"/>
</resultMap>
<sql id="Example_Where_Clause">
<where>
<foreach collection="oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">
<trim prefix="(" prefixOverrides="and" suffix=")">
<foreach collection="criteria.criteria" item="criterion">
<choose>
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="("
separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Base_Column_List">
user.id as user_id, user.username as user_username, user.`password` as `user_password`,
user.age as user_age, user.sex as user_sex, user.`status` as `user_status`, user.`date` as `user_date`
</sql>
<select id="selectByExample" parameterType="com.json.bean.UserExample" resultMap="BaseResultMap">
select
<if test="distinct">
distinct
</if>
<include refid="Base_Column_List"/>
from user user
<if test="_parameter != null">
<include refid="Example_Where_Clause"/>
</if>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
<if test="limit != null">
<if test="offset != null">
limit ${offset}, ${limit}
</if>
<if test="offset == null">
limit ${limit}
</if>
</if>
</select>
</mapper>
Controller 控制层
-
UserController.java
控制层
package com.json.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.json.bean.User;
import com.json.service.UserService;
import com.widget.bean.Category;
import com.widget.bean.Widgetdetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* @ClassName: UserController
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/5 17:55
*/
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@ResponseBody
@RequestMapping("list")
public String getUserList() throws JsonProcessingException {
List<User> userList = userService.getUserList();
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(userList);
}
}
测试结果
此时发现正常请求数据,实体类的所有属性及值都会返回!
[
{
"id": 1,
"username": "zhangsan",
"password": "zs123",
"age": 20,
"sex": 0,
"status": 0,
"date": 1604592000000
}
]
添加使用注解后写法
其他代码不需要修改
,只需要给 实体类不想暴露出去的属性添加 @JsonIgnore
注解即可完美解决!
修改后的实体类
User.java
package com.json.bean;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @ClassName: User
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/5 17:55
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
@JsonIgnore //加了注解
private Integer id;
private String username;
@JsonIgnore
private String password;
private Integer age;
private Integer sex;
@JsonIgnore
private Integer status;
@JsonIgnore
private Date date;
private static final long serialVersionUID = 1L;
}
此时可以发现我只有对 username
、 age
、 sex
三个属性没有添加注解!
最后我们重启服务,重新测试查看结果!
添加注解后测试结果
亮点来了!最终测试发现,结果只有没有加注解的三个属性及对应的值,其余属性都没有返回!
[
{
"username": "zhangsan",
"age": 20,
"sex": 0
}
]
注意⚠️
如果发现加了 @JsonIgnore
注解没有生效
,可能 jar 包冲突了,因为你可能在 数据 Json 序列化的时候使用的是 alibaba
的 fastjson
, 这时候就不能使用 @JsonIgnore
, 因为它是 Jackson
的, alibaba
的 fastjson
需要使用 @JSONField(serialize = false)
注解。
总结
看到这,今天要说的 @JsonIgnore 注解 就到此完结了,想下发那个属性就下发那个属性,是不是非常nice,数据交互起来就更完美!快去试一试吧!别着急,还有更多的秘密等着你来探索!