簡體   English   中英

Spring @RequestBody映射問題-如何查看未映射的值?

[英]Spring @RequestBody mapping issue - how to see unmapped values?

我正在使用Spring Controller通過@RequestBody批注將JSON轉換為Java。 我正在調試它,但是,正如我之前所經歷的那樣,我知道JSON沒有映射到我的實體,但是我非常好奇從Java的角度來看,未映射的JSON是什么。 有什么方法可以使它在Controller中可見? 這是我的控制器方法:

    @PostMapping(path="/Add") // Map ONLY GET Requests
public @ResponseBody PurchaseRequestLineItem addNewPurchaseRequestLineItem (@RequestBody PurchaseRequestLineItem purchaseRequestLineItem) {

    purchaseRequestLineItemRepository.save(purchaseRequestLineItem);
    System.out.println("PurchaseRequestLineItem saved:  "+purchaseRequestLineItem);
    return purchaseRequestLineItem;
}

這是我的實體:

    package com.prs.business.purchaserequest;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name="purchaserequestlineitem")
public class PurchaseRequestLineItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
//  @Column(name="purchaserequestid")
//  private int purchaseRequestID;
    @ManyToOne
    @JoinColumn(name="PurchaseRequestID")
    @JsonIgnore
    private PurchaseRequest purchaseRequest;
    private int productID;
    private int quantity;

    public PurchaseRequestLineItem() {
        id = 0;
        //purchaseRequestID = 0;
        purchaseRequest = null;
        productID = 0;
        quantity = 0;
    }

    public PurchaseRequestLineItem(PurchaseRequest inPR, int inPdtID, int inQty) {
        purchaseRequest = inPR;
        productID = inPdtID;
        quantity = inQty;
    }

//  public PurchaseRequestLineItem(int inPRID, int inPdtID, int inQty) {
//      purchaseRequestID = inPRID;
//      productID = inPdtID;
//      quantity = inQty;
//  }
//  
    public PurchaseRequestLineItem(int inID, PurchaseRequest inPR, int inPdtID, int inQty) {
        id = inID;
        purchaseRequest = inPR;
        productID = inPdtID;
        quantity = inQty;
    }

//  public PurchaseRequestLineItem(int inID, int inPRID, int inPdtID, int inQty) {
//      id = inID;
//      purchaseRequestID = inPRID;
//      productID = inPdtID;
//      quantity = inQty;
//  }
//
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

//  public int getPurchaseRequestID() {
//      return purchaseRequestID;
//  }
//
//  public void setPurchaseRequestID(int purchaseRequestID) {
//      this.purchaseRequestID = purchaseRequestID;
//  }
//
    public PurchaseRequest getPurchaseRequest() {
        return purchaseRequest;
    }
    public void setPurchaseRequest(PurchaseRequest purchaseRequest) {
        this.purchaseRequest = purchaseRequest;
    }
    public int getProductID() {
        return productID;
    }
    public void setProductID(int productID) {
        this.productID = productID;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        return "\npurchaseRequestLineItem [id=" + id + ", purchaseRequest=" + purchaseRequest + ", productID="
                + productID + ", quantity=" + quantity + "]";
    }

}

我的屬性文件中的行是:spring.jackson.property-naming-strategy = UPPER_CAMEL_CASE

您可以使用String原樣查看請求正文

@PostMapping(path="/Add") // Map ONLY GET Requests
public @ResponseBody PurchaseRequestLineItem addNewPurchaseRequestLineItem (@RequestBody String json) {
    // do whatever you want
}

假設您使用@gtosto指出的傑克遜JSON映射,將@RequestBody接受為String並自己執行從String到JSON的轉換。

使用ObjectMapper進行翻譯。

這是一個簡單的方法:

public <Type> Type getInputJson(
    final String trackId,
    final Class<Type> inputJsonClass,
    final String inputJsonString)
{
    Type returnValue;

    try
    {
        returnValue = objectMapper.readValue(
            inputJsonString,
            inputJsonClass);
    }
    catch (IOException exception)
    {
        logger.warn(
            "exception while converting inputJson.  inputJsonClass.name: {}, inputJsonString: {}",
            inputJsonClass.getName(),
            inputJsonString);

        returnValue = null;
    }

    return returnValue;
}

編輯刪除我的垃圾(CoreUtil)。 另外,我使用logback,所以我的日志字符串可能與您的日志字符串不匹配。

第二種選擇是像您當前正在接受的那樣接受@RequestBody參數,並添加WebRequestHttpServletRequest參數。 這些使您可以訪問整個請求(包括請求主體)。

注意使用ObjectMapper不會使未映射的內容可供您使用,而只會進行json->對象映射。 您需要檢查inputJsonString來找到未映射的值。

我使用以下3個Jackson依賴項:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>

和以下屬性:

    <jackson.version>2.2.3</jackson.version>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM