[英]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
參數,並添加WebRequest
或HttpServletRequest
參數。 這些使您可以訪問整個請求(包括請求主體)。
注意使用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.