简体   繁体   English

如何在 java rest 客户端中从 angular 接收 Blob 数据

[英]How to receive Blob data from angular in java rest client

I created a pdf in angular, which I've put in a Blob object.我在 angular 中创建了一个 pdf,我将它放入了一个 Blob object。 I'm sending this Blob object, togheter with an Order object (combined in payload OrderAndBlob) to my java restclient.我将这个 Blob object 连同 Order object(结合在有效负载 OrderAndBlob 中)一起发送到我的 java restclient。 Though I seem unable to receive this value.虽然我似乎无法收到这个值。 I always get an error that java doesn't understand the Blob object coming in. I get this error:我总是收到 java 不理解 Blob object 进来的错误。我收到此错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.sql.Blob` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream)

I follow this article Cannot construct instance of - Jackson and tried to add我按照这篇文章无法构造实例 - Jackson并尝试添加

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")

in front of my Blob object inside the OrderAndBlob, but that just changes the error.在 OrderAndBlob 内的我的 Blob object 前面,但这只会改变错误。 How can I make sure the Blob object gets parsed?如何确保 Blob object 被解析?

Angular ts code: Angular ts代码:

  @ViewChild('pdfOrder') pdfOrder!: ElementRef;

   confirmOrder(): void {

    let DATA: any = document.body;
    html2canvas(DATA).then( async (canvas) => {
          let fileWidth = 208;
          let fileHeight = (canvas.height * fileWidth) / canvas.width;
          let PDF = new jsPDF('p', 'mm', 'a4');
          let position = 0;
          PDF.addImage(canvas, 'PNG', 0, position, fileWidth, fileHeight);
          console.log("in ts file:" + PDF);
          this.pdfBlob = PDF.output('blob');
          console.log("in ts file converted to blob:" + this.pdfBlob);

    }).then((value:void)=>{
          this.salesproductService.submitOrderedItems(this.order, this.pdfBlob);
          this.router.navigate(["/main"]);
          }
    )

   
  }

Angular service: Angular 服务:

  public submitOrderedItems(order: Order, pdf: Blob) {
    console.log("submitting ordered items");
    const url = "http://localhost:8080/orders/add";

    console.log(pdf);
    this.orderAndBlob = new OrderAndBlob(order, pdf);

    console.log(this.orderAndBlob);
    this.http.post(url, this.orderAndBlob).subscribe(value => {});
    
    console.log("sended");
  }

Java controller + object: Java controller + object:

@RestController
@RequestMapping("/orders")
@CrossOrigin(origins = "*", maxAge = 3600)
public class OrderController {
    @PostMapping("/add")
    @PreAuthorize("hasRole('USER')")
    public void addOrders(@RequestBody OrderAndBlob orderAndBlob) {
        System.out.println(orderAndBlob.getBlob());
        orderService.saveOrderAndLines(orderAndBlob.getOrder());
    }
}



public class OrderAndBlob {
    private Order order;
    private Blob blob;
    public Order getOrder() {
        return order;
    }
    //@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
    public Blob getBlob() {
        return blob;
    }
    
    
}

Using FormData you can do so, Please let me know if need any help使用 FormData 你可以这样做,如果需要任何帮助,请告诉我

public postWithFormData(_url: string, blob: any, filename: any): Observable<any> 
{
    var formData = new FormData();
    formData.append("file", blob, filename);
    return this.httpclient.post(_url, formData, {
      reportProgress: true,
      responseType: "json"
    });
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM