java只返回实体类中的部分字段问题如何解决
java只返回实体类中的部分字段问题如何解决
本文讲解"java只返回实体类中的部分字段问题怎么解决",希望能够解决相关问题。
如何只返回实体类中的部分字段
在实体类上添加注解
@jsoninclude(jsoninclude.include.non_empty)
表示实体类中为null,空字符串,空集合数组等内容不会被序列化,即不会返回字段和值。
以下为对注解所有取值的简介
always // 默认策略,任何情况都执行序列化 non_null // 非空 non_absent // null的不会序列化,但如果类型是atomicreference,依然会被序列化 non_empty // null、集合数组等没有内容、空字符串等,都不会被序列化 non_default // 如果字段是默认值,就不会被序列化 custom // 此时要指定valuefilter属性,该属性对应一个类,用来自定义判断被jsoninclude修饰的字段是否序列化 use_defaults // 当jsoninclude在类和属性上都有时,优先使用属性上的注解,此时如果在序列化的get方法上使用了jsoninclude,并设置为use_defaults,就会使用类注解的设置
java动态添加实体类字段并返回给前端
工具类
package com.bless.wms.utils;
import lombok.extern.slf4j.slf4j;
import org.apache.commons.beanutils.propertyutilsbean;
import org.springframework.cglib.beans.beangenerator;
import org.springframework.cglib.beans.beanmap;
import java.beans.propertydescriptor;
import java.lang.reflect.invocationtargetexception;
import java.util.hashmap;
import java.util.map;
/**
* 动态添加实体类字段
*/
@slf4j
public final class propertyappender {
private static final class dynamicbean {
private object target;
private beanmap beanmap;
private dynamicbean(class superclass, map propertymap) {
this.target = generatebean(superclass, propertymap);
this.beanmap = beanmap.create(this.target);
}
private void setvalue(string property, object value) {
beanmap.put(property, value);
}
private object getvalue(string property) {
return beanmap.get(property);
}
private object gettarget() {
return this.target;
}
/**
* 根据属性生成对象
*/
private object generatebean(class superclass, map propertymap) {
beangenerator generator = new beangenerator();
if (null != superclass) {
generator.setsuperclass(superclass);
}
beangenerator.addproperties(generator, propertymap);
return generator.create();
}
}
public static object generate(object dest, map newvaluemap) throws invocationtargetexception, illegalaccessexception {
propertyutilsbean propertyutilsbean = new propertyutilsbean();
//1.获取原对象的字段数组
propertydescriptor[] descriptorarr = propertyutilsbean.getpropertydescriptors(dest);
//2.遍历原对象的字段数组,并将其封装到map
map oldkeymap = new hashmap<>();
for (propertydescriptor it : descriptorarr) {
if (!"class".equalsignorecase(it.getname())) {
oldkeymap.put(it.getname(), it.getpropertytype());
newvaluemap.put(it.getname(), it.getreadmethod().invoke(dest));
}
}
//3.将扩展字段map合并到原字段map中
newvaluemap.foreach((k, v) -> oldkeymap.put(k, v.getclass()));
//4.根据新的字段组合生成子类对象
dynamicbean dynamicbean = new dynamicbean(dest.getclass(), oldkeymap);
//5.放回合并后的属性集合
newvaluemap.foreach((k, v) -> {
try {
dynamicbean.setvalue(k, v);
} catch (exception e) {
log.error("动态添加字段【值】出错", e);
}
});
return dynamicbean.gettarget();
}
}调用

前端接口调用测试

备注:前端表格直接for循环动态渲染就ok了


