java bean复制限制字段用于更快的传输

java bean复制限制字段用于更快的传输,java,spring,Java,Spring,我想从大订单中获得一个较小的订单,该订单只包含需要的字段,例如:orderId、province、productName。这样我可以节省大量带宽和序列化时间 现在我需要您的帮助,因为我无法通过spring BeanRapper获取所有productName // i want get all names, not only index 1, how to do ? keepFields.add("productInfos[1].name"); 参考资料:(3

我想从大订单中获得一个较小的订单,该订单只包含需要的字段,例如:orderId、province、productName。这样我可以节省大量带宽和序列化时间

现在我需要您的帮助,因为我无法通过spring BeanRapper获取所有productName

    // i want get all names, not only index 1, how to do ?
    keepFields.add("productInfos[1].name");
参考资料:(3.3)

我的测试代码:

package com.hisen.copy.small.utils;
导入com.google.common.collect.list;
导入com.google.gson.gson;
导入com.hisen.copy.small.bean.Address;
导入com.hisen.copy.small.bean.Order;
导入com.hisen.copy.small.bean.ProductInfo;
导入org.springframework.beans.BeanWrapper;
导入org.springframework.beans.PropertyAccessorFactory;
导入java.math.BigDecimal;
导入java.util.List;
/**
*复制一个小豆子
*
*@作者海森源
*@date 2020-09-26 14:49
*/
公共类copymallerUtils{
公共静态void main(字符串[]args){
Order=getOrder();
订单小订单=新订单();
List keepFields=Lists.newArrayList();
keepFields.add(“orderId”);
keepFields.add(“地址.省”);
//我想得到所有的名字,不只是索引1,怎么办?
keepFields.add(“productInfos[1].name”);
copyProperties(订单、小订单、保留字段);
Gson Gson=新的Gson();
System.out.println(“src:+gson.toJson(order));
System.out.println(“dst:+gson.toJson(smalleroorder));
//src:{“地址”:{“省”:“B”,“市”:“A”,“县”:“C”},“产品信息”:[{“产品ID”:0,“名称”:“名称0”,“价格”:1,“数字”:0,“imgUrl”:“url1”},{“产品ID”:0,“名称”:“名称”:“名称”:0,“imgUrl”:“url1”},{“产品ID”:0,“名称”:“名称2”,“价格”:3,“数字”:0,“imgUrl”:“url1”}
//dst:{“地址”:{“省”:“B”},“产品信息”:[{“产品标识”:0,“数量”:0},{“产品标识”:0,“名称”:“名称1”,“数量”:0}]}
}
/**
*仅复制所需的字段
*@param src
*@param-dst
*@param字段
*/
私有静态void copyProperties(订单src、订单dst、列表字段){
BeanRapper srcWarp=PropertyAccessorFactory.forBeanPropertyAccess(src);
BeanRapper dstWarp=PropertyAccessorFactory.forBeanPropertyAccess(dst);
dstWarp.setAutoGrowCollectionLimit(10);
dstWarp.setAutologownestedPath(true);
fields.forEach(f->dstWarp.setPropertyValue(f,srcWarp.getPropertyValue(f));
}
/**
*获得订单
*@返回
*/
私有静态订单getOrder(){
订单=新订单();
地址=新地址();
地址:setCity(“A”);
地址:塞特省(“B”);
地址:塞特郡(“C”);
订单。设置地址(地址);
List productInfos=Lists.newArrayList();
整数倍=3;
for(int i=0;i
package com.hisen.copy.smaller.bean;
导入java.util.List;
/**
*@作者海森源
*@date 2020-09-26 14:44
*/
公共阶级秩序{
私有字符串orderId;
私人地址;
私有列表产品信息;
公共字符串getOrderId(){
返回订单ID;
}
公共无效setOrderId(字符串orderId){
this.orderId=orderId;
}
公共广播getAddress(){
回信地址;
}
公共无效设置地址(地址){
this.address=地址;
}
公共列表getProductInfos(){
返回产品信息;
}
public void setProductInfos(列出productInfos){
this.productInfos=productInfos;
}
}
package com.hisen.copy.smaller.bean;
/**
*@作者海森源
*@date 2020-09-26 14:42
*/
公共课堂演讲{
私人弦省;
私人城市;
私家弦县;
公共字符串getProvince(){
回归省;
}
公共省(字符串省){
这个省=省;
}
公共字符串getCity(){
回归城市;
}
公共城市(字符串城市){
this.city=城市;
}
公共字符串getCounty(){
回归县;
}
公营县(字符串县){
this.county=县;
}
}

您可以使用数据传输对象(DTO)。DTO本质上类似于Java类,但它不包含任何业务逻辑。考虑一下,通过使用简化的对象而不是原始的实体类来减少远程调用的数量

要在两个模型中的数据可能相似的情况下执行实体DTO转换,可以使用类似ModelMapper的库:


您也可以查看本教程:

介绍DTO。谢谢您的回答。作为一个提供者,消费者告诉他们需要什么,然后再运行,这是一个可变的过程,而不是一个固定的过程。ModelMapper只需将字段格式化为PropertyEditor。
package com.hisen.copy.smaller.bean;

import java.math.BigDecimal;

/**
 * @author hisenyuan
 * @date 2020-09-26 14:45
 */
public class ProductInfo {
    private long productId;
    private String name;
    private BigDecimal price;
    private BigDecimal discount;
    private int num;
    private String imgUrl;

    public long getProductId() {
        return productId;
    }

    public void setProductId(long productId) {
        this.productId = productId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public BigDecimal getDiscount() {
        return discount;
    }

    public void setDiscount(BigDecimal discount) {
        this.discount = discount;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }
}