文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring BeanUtils如何忽略空值拷贝

2023-06-29 13:25

关注

这篇文章主要讲解了“Spring BeanUtils如何忽略空值拷贝”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring BeanUtils如何忽略空值拷贝”吧!

BeanUtils类所在的包

有两个包都提供了BeanUtils类:

Spring的(推荐):org.springframework.beans.BeanUtilsApache的:org.apache.commons.beanutils.BeanUtils

忽略null值拷贝属性的用法

BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)

获取null属性名(工具类)

可以自己写一个工具类,用来获取对象里所有null的属性名字。

package com.example.util; import org.springframework.beans.BeanWrapper;import org.springframework.beans.BeanWrapperImpl;import java.beans.PropertyDescriptor;import java.util.HashSet;import java.util.Set;public class PropertyUtil {    public static String[] getNullPropertyNames(Object source) {        BeanWrapper src = new BeanWrapperImpl(source);        PropertyDescriptor[] pds = src.getPropertyDescriptors();        Set<String> emptyNames = new HashSet<>();        for (PropertyDescriptor pd : pds) {            //check if value of this property is null then add it to the collection            Object srcValue = src.getPropertyValue(pd.getName());            if (srcValue == null){                emptyNames.add(pd.getName());            }        }        String[] result = new String[emptyNames.size()];        return emptyNames.toArray(result);    }}

示例

本处为了全面,将以下几种情况都考虑进去:

工具类

package com.example.util; import org.springframework.beans.BeanWrapper;import org.springframework.beans.BeanWrapperImpl;import java.beans.PropertyDescriptor;import java.util.HashSet;import java.util.Set;public class PropertyUtil {    public static String[] getNullPropertyNames(Object source) {        BeanWrapper src = new BeanWrapperImpl(source);        PropertyDescriptor[] pds = src.getPropertyDescriptors();        Set<String> emptyNames = new HashSet<>();        for (PropertyDescriptor pd : pds) {            //check if value of this property is null then add it to the collection            Object srcValue = src.getPropertyValue(pd.getName());            if (srcValue == null){                emptyNames.add(pd.getName());            }        }        String[] result = new String[emptyNames.size()];        return emptyNames.toArray(result);    }}

Entity

基础Entity

package com.example.entity; import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import java.time.LocalDateTime;@Datapublic class BaseEntity {    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")    private LocalDateTime createTime;    private LocalDateTime updateTime;    private Long deletedFlag;}

User

package com.example.entity; import lombok.Data;@Datapublic class User {    private Long id;    private String userName;    private String nickName;    // 0:正常 1:被锁定    private Integer status;}

Blog

package com.example.entity; import lombok.Data;import lombok.EqualsAndHashCode;@Data@EqualsAndHashCode(callSuper = true)public class Blog extends BaseEntity{    private Long id;    private String title;    private String content;    private User user;}

VO

package com.example.vo; import com.example.entity.BaseEntity;import com.example.entity.User;import lombok.Data;import lombok.EqualsAndHashCode;@Data@EqualsAndHashCode(callSuper = true)public class BlogRequest extends BaseEntity {    private Long id;    private String title;    private String content;    private User user;}

Controller

package com.example.controller; import com.example.entity.Blog;import com.example.entity.User;import com.example.util.PropertyUtil;import com.example.vo.BlogRequest;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.beans.BeanUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;import java.util.Arrays;@RestControllerpublic class HelloController {    @Autowired    private ObjectMapper objectMapper;    @GetMapping("/test")    public String test() {        BlogRequest blogRequest = new BlogRequest();        blogRequest.setId(10L);        blogRequest.setTitle("Java实战");        // blogRequest.setContent("本文介绍获取null的字段名的方法");        blogRequest.setUser(new User());        blogRequest.setCreateTime(LocalDateTime.now());        // blogRequest.setCreateTime(LocalDateTime.now());        blogRequest.setDeletedFlag(0L);        User user = new User();        user.setId(15L);        user.setUserName("Tony");        // user.setNickName("Iron Man");        // user.setStatus(1);        String[] nullPropertyNames = PropertyUtil.getNullPropertyNames(blogRequest);        System.out.println(Arrays.toString(nullPropertyNames));        System.out.println("------------------------------");        Blog blog = new Blog();        BeanUtils.copyProperties(blogRequest, blog, nullPropertyNames);        try {            System.out.println(objectMapper.writeValueAsString(blog));        } catch (JsonProcessingException e) {            e.printStackTrace();        }        return "test success";    }}

测试

访问:http://localhost:8080/test/

后端结果:

[updateTime, content]------------------------------{"createTime":"2022-03-17 19:58:32","updateTime":null,"deletedFlag":0,"id":10,"title":"Java实战","content":null,"user":{"id":null,"userName":null,"nickName":null,"status":null}}

结论

 其他文件

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.3.0.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.example</groupId>    <artifactId>demo_SpringBoot</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>demo_SpringBoot</name>    <description>Demo project for Spring Boot</description>     <properties>        <java.version>1.8</java.version>    </properties>     <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>         <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.16.20</version>            <scope>provided</scope>        </dependency>     </dependencies>     <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <version>2.3.0.RELEASE</version>            </plugin>        </plugins>    </build> </project>

感谢各位的阅读,以上就是“Spring BeanUtils如何忽略空值拷贝”的内容了,经过本文的学习后,相信大家对Spring BeanUtils如何忽略空值拷贝这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯