Api returns blob 变量为 null

Api returns blob variable as null

已经在 Spring 引导函数中创建了 Rest Api,它使用少量变量创建新订单,并将图片作为 Blob 发送到数据库。

我一切正常,但现在当我尝试将此图片作为来自数据库的响应时,我将此 Blob 作为空值获取。

我的Controller代码如下图

@GetMapping(path = "/getallorders")
public List<OrderAllUsersResponse> getAllOrders() {

    List<OrderAllUsersResponse> returnValue = new ArrayList<>();

    List<OrderEntity> orders = orderRepostiory.findAllOrders();
    ModelMapper modelMapper = new ModelMapper();

    for (int i=0; i < orders.size(); i++) {
        returnValue.add(modelMapper.map(orders.get(i), OrderAllUsersResponse.class));
    }

    return returnValue;
}

我的Repository代码如下图


public interface OrderRepostiory extends JpaRepository<OrderEntity, Long> {

    @Query(value = "SELECT * FROM 34671478_opionion.cargo", nativeQuery = true)
    List<OrderEntity> findAllOrders();
}

@Entity(name = "cargo")
public class OrderEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false)
    private String orderId;

    @Column(nullable = false)
    private String customer;

    @Column(nullable = false)
    private String loadingCompanyName;

    @Column(nullable = false)
    private String loadingCity;

    @Column(nullable = false)
    private String loadingPostcode;

    @Column(nullable = false)
    private String dateOfLoading;

    @Column(nullable = false)
    private String unloadingCompanyName;

    @Column(nullable = false)
    private String unloadingCity;

    @Column(nullable = false)
    private String unloadingPostcode;

    @Column(nullable = false)
    private String dateOfUnloading;

    @Column(nullable = false)
    private Double nettoPrice;

    @Column(nullable = false)
    private Double bruttoPrice;

    @Column(nullable = false)
    private String information;

    @Column(nullable = false)
    private Boolean paymentStatus = false;

    @ManyToOne
    @NotFound(action= NotFoundAction.IGNORE)
    @JoinColumn(name = "company_id")
    private CompanyEntity companyDetails;

    @Lob
    @Column(name = "photo", columnDefinition="BLOB")
    private byte[] data;

    public byte[] getData() {
        return data;
    }

    public void setData(byte[] data) {
        this.data = data;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getCustomer() {
        return customer;
    }

    public void setCustomer(String customer) {
        this.customer = customer;
    }

    public String getLoadingCompanyName() {
        return loadingCompanyName;
    }

    public void setLoadingCompanyName(String loadingCompanyName) {
        this.loadingCompanyName = loadingCompanyName;
    }

    public String getLoadingCity() {
        return loadingCity;
    }

    public void setLoadingCity(String loadingCity) {
        this.loadingCity = loadingCity;
    }

    public String getLoadingPostcode() {
        return loadingPostcode;
    }

    public void setLoadingPostcode(String loadingPostcode) {
        this.loadingPostcode = loadingPostcode;
    }

    public String getDateOfLoading() {
        return dateOfLoading;
    }

    public void setDateOfLoading(String dateOfLoading) {
        this.dateOfLoading = dateOfLoading;
    }

    public String getUnloadingCompanyName() {
        return unloadingCompanyName;
    }

    public void setUnloadingCompanyName(String unloadingCompanyName) {
        this.unloadingCompanyName = unloadingCompanyName;
    }

    public String getUnloadingCity() {
        return unloadingCity;
    }

    public void setUnloadingCity(String unloadingCity) {
        this.unloadingCity = unloadingCity;
    }

    public String getUnloadingPostcode() {
        return unloadingPostcode;
    }

    public void setUnloadingPostcode(String unloadingPostcode) {
        this.unloadingPostcode = unloadingPostcode;
    }

    public String getDateOfUnloading() {
        return dateOfUnloading;
    }

    public void setDateOfUnloading(String dateOfUnloading) {
        this.dateOfUnloading = dateOfUnloading;
    }

    public Double getNettoPrice() {
        return nettoPrice;
    }

    public void setNettoPrice(Double nettoPrice) {
        this.nettoPrice = nettoPrice;
    }

    public Double getBruttoPrice() {
        return bruttoPrice;
    }

    public void setBruttoPrice(Double bruttoPrice) {
        this.bruttoPrice = bruttoPrice;
    }

    public CompanyEntity getCompanyDetails() {
        return companyDetails;
    }

    public void setCompanyDetails(CompanyEntity companyDetails) {
        this.companyDetails = companyDetails;
    }

    public String getInformation() {
        return information;
    }

    public void setInformation(String information) {
        this.information = information;
    }

    public Boolean getPaymentStatus() {
        return paymentStatus;
    }

    public void setPaymentStatus(Boolean paymentStatus) {
        this.paymentStatus = paymentStatus;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }
}

下面我将向您展示 Postman 的响应结果。

如您所见,变量 'photo' 为空。我如何修复它以将其作为例如 byte64string

下面是 OrderAllUsersResponse class 代码:

对于 modelMapper 的默认映射机制,您的源 (OrderEntity) 和目标 (OrderAllUsersResponse) 对象应该彼此相似。

@Entity(name = "cargo")
public class OrderEntity implements Serializable {

    @Lob
    @Column(name = "photo", columnDefinition="BLOB")
    private byte[] data;

    public byte[] getData() {
        return data;
    }

    public void setData(byte[] data) {
        this.data = data;
    }
}

import com.fasterxml.jackson.annotation.JsonProperty;

public class OrderAllUsersResponse {

        @JsonProperty("photo")
        private byte[] data;
    
        public byte[] getData() {
            return data;
        }
    
        public void setData(byte[] data) {
            this.data = data;
        }
  }

如果源字段名称与目标字段名称不同,那么要定义 属性 映射,您将使用 ModelMapper 的 TypeMap。

@Entity(name = "cargo")
public class OrderEntity implements Serializable {

    @Lob
    @Column(name = "photo", columnDefinition="BLOB")
    private byte[] data;

    public byte[] getData() {
        return data;
    }

    public void setData(byte[] data) {
        this.data = data;
    }
}

public class OrderAllUsersResponse {
        private byte[] photo;
    
        public byte[] getPhoto() {
            return photo;
        }
    
        public void setPhoto(byte[] photo) {
            this.photo = photo;
        }
  }

TypeMaping

@GetMapping(path = "/getallorders")
public List<OrderAllUsersResponse> getAllOrders() {
    List<OrderAllUsersResponse> returnValue = new ArrayList<>();
    List<OrderEntity> orders = orderRepostiory.findAllOrders();

    ModelMapper modelMapper = new ModelMapper();
    TypeMap<OrderEntity, OrderAllUsersResponse> propertyMapper = modelMapper.createTypeMap(OrderEntity.class, OrderAllUsersResponse.class);

    for (int i=0; i < orders.size(); i++) {
        propertyMapper.addMapping(OrderEntity::getData, OrderAllUsersResponse::setPhoto);
        returnValue.add(modelMapper.map(orders.get(i), OrderAllUsersResponse.class));
    }

    return returnValue;
}