Spring BeanUtils忽略空值拷贝的方法示例代码

网友投稿 298 2022-08-19


Spring BeanUtils忽略空值拷贝的方法示例代码

目录简介获取null属性名(工具类)示例工具类EntityController测试 其他文件其他网址

简介

说明

本文用示例介绍Spring(SpringBoot)如何使用BeanUtils拷贝对象属性(忽略空值)。

BeanUtils类所在的包

有两个包都提供了BeanUtils类:

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

忽略null值拷贝属性的用法

BeanUtijvTEvNils.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 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

工具类

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 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;

@Data

public 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;

@Data

public 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;

@RestController

public 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}}

结论

可以获取父类的null的属性名不可以获取属性的null的属性名

其他文件

pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.3.0.RELEASE

com.example

demo_SpringBoot

0.0.1-SNAPSHOT

demo_SpringBoot

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

1.16.20

provided

org.springframework.boot

spring-boot-maven-plugin

2.3.0.RELEASE

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.3.0.RELEASE

com.example

demo_SpringBoot

0.0.1-SNAPSHOT

demo_SpringBoot

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

1.16.20

provided

org.springframework.boot

spring-boot-maven-plugin

2.3.0.RELEASE

其他网址

Spring BeanUtils忽略空值拷贝用法 - 掘金


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java Excel数据导入数据库的方法
下一篇:springboot访问静态资源遇到的坑及解决
相关文章

 发表评论

暂时没有评论,来抢沙发吧~