Eu tenho o seguinte pedido JSON
{
"FreightCalculationRequest": {
"Products": [
{
"sku": "123",
"size": "S",
"quantity": "1",
"shipAlone": "True",
"itemType": "Shoe"
},
{
"sku": "123",
"size": "S",
"quantity": "1",
"shipAlone": "True",
"itemType": "Shoe"
}
],
"ShipToZip": "54452",
"IsCommercial": "True"
}
}
Estou tentando enviar esta solicitação ao método de controlador API como um objeto java personalizado e, em seguida, retornar o mesmo objeto como uma string JSON formatado. Eu estou recebendo uma resposta através do carteiro no entanto, para produtos e shiptoZip eu conseguir um nulo, e para isCommercial eu recebo falso, mas eu nem sequer têm falso como um valor para isCommercial no pedido. O que está acontecendo? Eu não sei como depurar muito bem em Java como eu basicamente estou verificando meu aplicativo cada vez digitando mvn primavera-boot: início
aqui é o meu objeto que estou voltando e usando como parâmetro para o método de controlador.
public class FreightCalculationRequest {
private Product[] Products;
private String ShipToZip;
private boolean IsCommercial;
public Product[] getProducts() { return this.Products; }
public void setProducts(Product[] itemsRequest) { this.Products = itemsRequest; }
public String getShipToZip() { return this.ShipToZip; }
public void setShipToZip(String ShipToZip) { this.ShipToZip = ShipToZip; }
public boolean getIsCommercial() { return this.IsCommercial; }
public void setIsCommercial(boolean IsCommercial) { this.IsCommercial = IsCommercial; }
}
e aqui é o controlador método im chamada
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
FreightCalculationRequest TestCall(@RequestBody FreightCalculationRequest calculationRequest) {
return calculationRequest;
}
Por que minha resposta não mostrando o mesmo que o pedido entrando.
update: eu adicionei @JsonProperty aos meus variáveis, e agora os olhares resposta como tal
{
"isCommercial": false,
"shipToZip": null,
"products": null,
"Products": null,
"ShipToZip": null,
"IsCommercial": false
}
Meio que perdi um pouco, também percebi que pode salvar minhas alterações enquanto mvn está em execução e vai auto compilação das mudanças
Update: Então o itemType na minha json estava realmente jogando um erro quando eu initally remover o embrulho de "FreightCalculationRequest" na resposta JSON, então eu pensei que era o problema, no entanto itemType é realmente um objeto no código para que ele se deveu a não me colocando em uma propriedade válida e ler o erro de análise json completamente, havia duas soluções para mim, envolvendo a resposta em outra classe, ou remover o FreightCalculationWrapping.
Eu também aprendi que eu preciso adicionar @JsonProperty para mapear o json
graças SO
Eu estou recebendo uma resposta através do carteiro no entanto, para produtos e shiptoZip eu conseguir um nulo, e para isCommercial eu recebo falso, mas eu nem sequer têm falso como um valor para isCommercial no pedido. O que está acontecendo?
Você vai ter que envolver o FreightCalculationRequest em uma nova classe de modelo.
Faça uma nova Wrapper classe,
public class FreightCalculationRequestWrapper {
@JsonProperty("FreightCalculationRequest")
private FreightCalculationRequest freightCalculationRequest;
...
}
Use esta nova Wrapper classe para lidar com seus pedidos:
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
FreightCalculationResponse TestCall(@RequestBody FreightCalculationRequestWrapper calculationRequest) {
return calculationRequest;
}
Além disso, os nomes de propriedade em seu JSON começar com uma letra maiúscula.
Se você estiver usando Jackson, em seguida, você pode usar @JsonProperty(...)
a anotação em seus campos de modelo para mapeá-los corretamente.
Por exemplo:
public class FreightCalculationRequest {
@JsonProperty("Products")
private Product[] Products;
.
.
.
}