专属目录

  • 爪哇基础 之 @JsonIgnore 注解
  • 前言
  • 作用
  • 使用
  • 正常不使用注解写法
  • pojo 实体类
  • Example类
  • Service 逻辑层
  • Mapper 数据持久化层 (此处逆向工程都可生成)
  • Controller 控制层
  • 测试结果
  • 添加使用注解后写法
  • 修改后的实体类
  • 添加注解后测试结果
  • 注意⚠️
  • 总结


爪哇基础 之 @JsonIgnore 注解

前言

日常Java开发时,会经常与前端开发、ios 或 安卓开发,进行数据交互,前面我们也说了使用json 序列化后交互,可是又有一个头疼的问题,那就是一般返回到前端的实体类中,是有一些属性不想暴露出去,比如 用户的密码,还有一些自增的ID等等一些不需要的信息。而有时候也有自身的原因,想偷懒不想专门写个 VODTOPO ,可那些多余的字段前端又不需要,我们又该如何处理呢!

今天我们就来说下仅用一个注解,即可搞定以上问题!这个注解就是 —— @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
  }
]

JacksonXmlRootElement 注解依賴 jsonignore注解_json

添加使用注解后写法

其他代码不需要修改,只需要给 实体类不想暴露出去的属性添加 @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;

}

此时可以发现我只有对 usernameagesex 三个属性没有添加注解!

最后我们重启服务,重新测试查看结果!

添加注解后测试结果

亮点来了!
最终测试发现,结果只有没有加注解的三个属性及对应的值,其余属性都没有返回!

[
  {
    "username": "zhangsan",
    "age": 20,
    "sex": 0
  }
]

JacksonXmlRootElement 注解依賴 jsonignore注解_java_02

注意⚠️

如果发现加了 @JsonIgnore 注解没有生效,可能 jar 包冲突了,因为你可能在 数据 Json 序列化的时候使用的是 alibabafastjson , 这时候就不能使用 @JsonIgnore , 因为它是 Jackson 的, alibabafastjson 需要使用 @JSONField(serialize = false) 注解。

总结

看到这,今天要说的 @JsonIgnore 注解 就到此完结了,想下发那个属性就下发那个属性,是不是非常nice,数据交互起来就更完美!快去试一试吧!别着急,还有更多的秘密等着你来探索!