【问题标题】:Spring @RequestBody mapping issue - how to see unmapped values?Spring @RequestBody 映射问题 - 如何查看未映射的值?
【发布时间】:2017-12-14 17:30:47
【问题描述】:

我正在使用 Spring 控制器通过 @RequestBody 注释将 JSON 转换为 Java。我正在调试这个,但是,正如我之前经历过的那样,我知道 JSON 没有被映射到我的实体,但我很好奇从 Java 的角度来看,非映射的 JSON 是什么。有没有办法让它在我的控制器中可见?这是我的控制器方法:

    @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

【问题讨论】:

  • 分享PurchaseRequestLineItem 代码。对“杰克逊”转换器基础结构配置代码的相同请求。
  • 刚刚添加了 PRLI 实体,但不确定您所说的“杰克逊”转换器 inf 是什么意思。配置代码。我认为这可能是命名策略属性。包括那个。
  • @PostMapping(path="/Add") // Map ONLY GET Requests... 与问题无关,但注意到这里有问题吗?

标签: java json spring


【解决方案1】:

您可以直接使用String 来查看请求正文

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

【讨论】:

    【解决方案2】:

    假设您使用 Jackson JSON 映射, 正如@gtosto 所指出的, 接受 @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>
    

    【讨论】:

    • 我看不出这是什么原因。如果 OP 想要一个 json 对象,他可以使用 @RequestBody JsonNode jsonNode 作为参数,无需手动转换 json。但是,通常需要将其作为字符串(如在另一个答案中)。您的代码还存在额外的依赖项:CoreUtil、记录器、输入 json 类...
    • 我正在试用 ObjectMapper,但遇到了几个问题... ObjectMapper... 是来自 fastxml.jackson 包吗?另外,CoreUtil 是否正确?在任何地方都没有看到那个。提前致谢!
    • 知道了.. 我现在可以看到如何查看请求中的所有内容.... 这与我传递的 JSON 相同,所以现在我意识到这不完全是我后。 :) 我特别有一个问题,我正在传递我认为好的 JSON,但它没有正确映射到我的 Java 实体。我将添加我的 JSON,希望您能看到我的问题。
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多