【问题标题】:Spring boot RequestBody getting null春季启动 RequestBody 为空
【发布时间】:2021-06-10 14:31:00
【问题描述】:

我是 Spring Boot 的新手,当我从 Postman 的 RestController 中获取 JSON 时遇到了一个小问题。

当我从 Postmat 发送带有其属性的请求时,它在 RequestBody 中总是为空。

这是我的 Rest 控制器

@RestController
@RequestMapping(value="/api/enviar",produces = MediaType.APPLICATION_JSON_VALUE,
        headers = {"content-type=application/json"})
@RequiredArgsConstructor
@Slf4j
public class EnviarAdicionService {
    @Autowired
    private final EnviarAdicionUseCase enviarAdicionUseCase;
    @Autowired
    private final GuardarLogUseCase guardarLogUseCase;

    private final Gson gson = new Gson();
    private String _statusCode;
    private Date dateStart;


    @PostMapping
    public DatosAdicionResponse PostAdicionFondos(@RequestBody @Valid RequestAdicion requestAdicion){
          //PostMapping logic
          ...
    }
}

我的 RequestAdicion 是这样的:

@Data
@NoArgsConstructor
public class RequestAdicion implements Serializable {
    private final static String regExpression = "\\{\\[sw\\.,ñÑ]\\+\\$}";
    @RequestHeaderValidation
    private RequestHeader Header;
    @CuentaValidation(NumeroIdentificacionName = "NumeroDocumentoCuentaOrigen", TipoIdentificacionName = "TipoDocumentoCuentaOrigen",
            TipoCuentaDepositosName = "TipoCuentaDepositoOrigen", NumeroCuentaDepositoName = "NumeroCuentaDepositoOrigen",
            EntidadCuentaName = "EntidadCuentaOrigen", TipoCuentaName = "TipoCuentaOrigen", NumeroCuentaName = "NumeroCuentaOrigen",
            CodigoFondoName = "CodigoFondoCuentaOrigen", EntidadCuentaDepositoName = "EntidadCuentaDepositoOrigen")
    private CuentaOrigen CuentaOrigen;
    @CuentaFondoValidation(TipoIdentificacionName = "TipoDocumentoCuentaDestino", NumeroIdentificacionFondoName = "NumeroDocumentoCuentaDestino",
            EntidadName = "EntidadCuentaDestino", CodigoFondoName = "CodigoFondoCuentaDestino",
            NumeroFondoInversionName = "NumeroFondoInversionCuentaDestino")
    private CuentaFondo CuentaDestino;
    @FormaDePagoValidation
    @Pattern(regexp = regExpression,message = "Valor no permitido. FormaDePago")
    private String FormaDePago;
    @ValorValidation
    private double ValorAdicion;
    @OficinaValidation
    private long Oficina;
    @CanalValidation
    @Pattern(regexp = regExpression,message = "Valor no permitido. Canal")
    private String Canal;
}

我在 Postman 中发送这些属性

Headers
Content-Type: application/json

Body
{
    "Header": {
        "SystemId": "AW1371",
        "MessageId": "1234567890120006",
        "UserName": "autWakanda",
        "Destination": {
            "Name": null,
            "NameSpace": null,
            "Operation": null
        }
    },
    "CuentaOrigen": {
    "NumeroDocumentoCuentaOrigen": 8232166,
    "TipoDocumentoCuentaOrigen": "1",
    "TipoCuentaDepositoOrigen": "7",
    "NumeroCuentaDepositoOrigen": "40673760005",
    "EntidadCuentaOrigen": "00007",
    "TipoCuentaOrigen": "7",
    "NumeroCuentaOrigen": "40673760005",
    "CodigoFondoCuentaOrigen": "123"
  },
  "CuentaDestino": {
    "TipoDocumentoCuentaDestino": "1",
    "NumeroDocumentoCuentaDestino": 1360740,
    "NumeroFondoInversionCuentaDestino": "0021008106434090",
    "EntidadCuentaDestino": "00532",
    "CodigoFondoCuentaDestino": "21"
  },
  "FormaDePago": "72",
  "ValorAdicion": 133000.31,
  "Oficina": 3132,
  "Canal": "SVE"
}

我尝试将第一个字符设置为小写,但它不起作用。

这是引发的异常:

Caused by: java.lang.NullPointerException: Cannot invoke "co.com.bancolombia.model.requestheader.RequestHeader.getSystemId()" because the return value of "co.com.bancolombia.api.models.RequestAdicion.getHeader()" is null

提前谢谢大家。

编辑:我解决了为每个字段设置注释 @JsonProperty 的问题,并为每个模型创建了一个 NoArgsConstructor 初始化没有值的变量和类中的注释 @AllArgsConstructor。

【问题讨论】:

    标签: java spring spring-boot microservices


    【解决方案1】:

    我只是出于不同的原因遇到了同样的问题,所以我添加了这个快速说明,也许可以帮助其他人。 我不明白为什么我的控制器参数注释为@RequestBody 会全部空白/空。已检查 Content-Type: application/json。

    在意识到我的 IDE 为该注释类选择了一个完全错误的导入之前,我浪费了很多时间。 所以只要确保你有

    import org.springframework.web.bind.annotation.*;
    

    而不是导入中的其他 RequestBody 类。

    【讨论】:

      【解决方案2】:

      问题在于你的情况。 AFAIK,默认情况下 spring 使用 camelCase,即使您使用 PascalCase(或 UpperCamelCase)作为您的字段。

      我建议您改用 camelCase,但如果您需要坚持使用 pascal 大小写,您应该添加: @JsonProperty("Header") 在您的标题字段上(并对其他字段执行相同操作。

      您也可以调整 objectMapper 以在没有注释的情况下执行此操作。

      【讨论】:

      • 我将 JsonProperty 放在每个字段中,但现在例外是:Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `co.com.bancolombia.model.requestheader.RequestHeader` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 我的数据类中有 Data 和 NoArgsConstructor Lombok 注释
      • 在项目根目录中添加一个名为 lombok.config 的文件,并将这一行放入:lombok.anyConstructor.addConstructorProperties=true,可能还放入config.stopBubbling=true
      • 对我不起作用,我会继续努力,但感谢您的帮助
      • 看来 RequestHeader 类是问题所在。确保您的所有模型类(也适用于您的字段)具有适当的构造函数(noArgs,或使用@JsonCreator 或通过lombok 添加的constructorProperties)但是,我相信我确实回答了您的原始问题,因此接受答案是合适的
      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2017-01-27
      • 2017-09-11
      相关资源
      最近更新 更多