ホームページ >Java >&#&チュートリアル >Javaがエンティティクラスの一部のフィールドのみを返す問題を解決する方法

Javaがエンティティクラスの一部のフィールドのみを返す問題を解決する方法

WBOY
WBOY転載
2023-06-21 11:20:421494ブラウズ

エンティティ クラスの一部のフィールドのみを返す方法

エンティティ クラスにアノテーションを追加する

@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<String, Class> 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<String, Class> 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<String, Object> newValueMap) throws InvocationTargetException, IllegalAccessException {
        PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
        //1.获取原对象的字段数组
        PropertyDescriptor[] descriptorArr = propertyUtilsBean.getPropertyDescriptors(dest);
        //2.遍历原对象的字段数组,并将其封装到Map
        Map<String, Class> 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();
    }
}

Call

Javaがエンティティクラスの一部のフィールドのみを返す問題を解決する方法

フロントエンド インターフェイス呼び出しテスト

Javaがエンティティクラスの一部のフィールドのみを返す問題を解決する方法

注: フロントエンド フォームでは、 for ループで直接動的にレンダリングされる

以上がJavaがエンティティクラスの一部のフィールドのみを返す問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。