【问题标题】:Spring Boot PostMapping Always Receives NullSpring Boot PostMapping 总是收到 Null
【发布时间】:2021-07-27 07:37:37
【问题描述】:

我正在使用 Spring Boot 在 Java 中开发 RESTful API。

我想做的是开发一个应该接收 JSON 值并最终返回另一个 JSON 值的端点。到目前为止我尝试过的如下。

基本实体:

package com.mycompany.layer.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicEntity {
    private Integer Id;
    private String Title;
    private String Field;
    private String ItemId;
    private String Question;
}

主要实体:

package com.mycompany.layer.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MainEntity {
    private BasicEntity[] MainData;
}

主控制器:

package com.mycompany.layer.controller;

import com.mycompany.layer.entities.MainEntity;

import org.some.model.Q;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("api/main")
public class MainController {
    @PostMapping(path = "/transform",
                 consumes = MediaType.APPLICATION_JSON_VALUE,
                 produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Q> Transform(@RequestBody MainEntity mainEntity) {
        Q q = new Q();

        System.out.print(mainEntity); // mainEntity is null

        return new ResponseEntity<>(q, HttpStatus.OK);
    }
}

我正在使用 Postman 发送以下 JSON 值,但当我向端点发送请求时,服务器端的 mainEntity 始终为空:

{
    "MainData": [
        {
            "Field": "E||D",
            "Id": 2,
            "Question": "Q1||Q2",
            "Title": "SomeTitle",
            "ItemId": "9||10"
        }
    ]
}

【问题讨论】:

  • 当使用 lombok 时,请尝试遵循变量命名约定,例如 Id 应该是 idTitle 应该是 title 等等

标签: java spring spring-boot


【解决方案1】:

您的字段以大写字母开头,这对 java 来说不是一个好习惯。

由于您的 setter 方法被命名为 setMainData(...),Jackson 假设变量命名为 ma​​inData,因为 Java 命名约定(变量应以小写字母开头)。

您可以像下面这样将@JsonProperty 添加到您的对象中进行映射。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MainEntity {
    @JsonProperty("MainData")
    private BasicEntity[] MainData;
}

【讨论】:

  • 只是补充一下,BasicEntity 也是如此 - 如果使用大写字母发送,它将映射为 null。还有比大写属性更多的不良做法。考虑使用 List 或 Set 而不是 Array。使用 int 而不是 Integer 并且可能使用 Value 而不是 Data 来使您的值对象不可变。
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2017-11-21
相关资源
最近更新 更多