Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`)

How can I solve the error presented?

this is my service :

@Service
public class EmisionPesoService {
    @Autowired
    private RestTemplate restTemplate;

    private final String URL = "https://desa-dapinstituciones.bancoestado.cl/api-gtw-emision-pesos/dap-min-pub/emision-pesos";

    public EmisionPesosDto postEmisionPesos(EmisionPesosBody emisionPesosBody, String accessToken) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Authorization", "Bearer " + accessToken);


        HttpEntity<EmisionPesosBody> entity = new HttpEntity<>(emisionPesosBody, headers);

        ResponseEntity<EmisionPesosDto> response = restTemplate.exchange(URL, HttpMethod.POST, entity, EmisionPesosDto.class);

        return response.getBody();
    }
}

this is my controller:

@RestController
public class EmisionPesoController {

    @Autowired
    private EmisionPesoService emisionPesoService;


    @PostMapping(value = "/emision-pesos", consumes = "application/json", produces = "application/json")
    public EmisionPesosDto emisionPesos(@RequestHeader("Authorization") String accessToken,
                                        @RequestBody Integer CodigoMoneda,
                                        @RequestBody Integer Plazo,
                                        @RequestBody BigDecimal MontoDeposito,
                                        @RequestBody String IndicadorRenovacion,
                                        @RequestBody Integer RutCliente,
                                        @RequestBody String DigitoRutCliente,
                                        @RequestBody Long NumCuentaCorriente,
                                        @RequestBody String RUC,
                                        @RequestBody String RUE,
                                        @RequestBody String FiscaliaRegional,
                                        @RequestBody String FiscaliaZonal,
                                        @RequestBody Integer RutUsuarioEmisor,
                                        @RequestBody String DigitoRutUsuarioEmisor) {
        EmisionPesosBody emisionPesosBody = new EmisionPesosBody();
        emisionPesosBody.setCodigoMoneda(CodigoMoneda);
        emisionPesosBody.setPlazo(Plazo);
        emisionPesosBody.setMontoDeposito(MontoDeposito);
        emisionPesosBody.setIndicadorRenovacion(IndicadorRenovacion);
        emisionPesosBody.setRutCliente(RutCliente);
        emisionPesosBody.setDigitoRutCliente(DigitoRutCliente);
        emisionPesosBody.setNumCuentaCorriente(NumCuentaCorriente);
        emisionPesosBody.setRUC(RUC);
        emisionPesosBody.setRUE(RUE);
        emisionPesosBody.setFiscaliaRegional(FiscaliaRegional);
        emisionPesosBody.setFiscaliaZonal(FiscaliaZonal);
        emisionPesosBody.setRutUsuarioEmisor(RutUsuarioEmisor);
        emisionPesosBody.setDigitoRutUsuarioEmisor(DigitoRutUsuarioEmisor);

        return emisionPesoService.postEmisionPesos(emisionPesosBody , accessToken);

    }
}

And the corresponding data

@Data
public class EmisionPesosBody {

    private Integer CodigoMoneda;
    private Integer Plazo;
    private BigDecimal MontoDeposito;
    private String IndicadorRenovacion;
    private Integer RutCliente;
    private String DigitoRutCliente;
    private Long NumCuentaCorriente;
    private String RUC;
    private String RUE;
    private String FiscaliaRegional;
    private String FiscaliaZonal;
    private Integer RutUsuarioEmisor;
    private String DigitoRutUsuarioEmisor;
}

@Data
public class EmisionPesosDto {


    private int code;
    private String message;
    private EmisionPesosPayloadDto payload;
}

@Data
public class EmisionPesosPayloadDto  {

    private String CodProducto;
    private String NumOperacion;
    private Integer CodigoMoneda;
    private String CodSubProducto;
    private String Plazo;
    private Integer FechaEmision;
    private Integer FechaVencimiento;
    private BigDecimal Monto;
    private BigDecimal MontoOrigen;
    private BigDecimal TasaBase;
    private BigDecimal TasaPeriodo;
    private BigDecimal MontoOrgIntPeriodo;
    private BigDecimal MontoFinalOrg;
    private String RUC;
    private String RUE;
    private String FiscaliaRegional;
    private String FiscaliaZonal;
}

I am working with rest template and the application requests a client certificate that loads correctly, the endpoints need a header with an access token which I obtain from another endpoint, which works correctly.

My main problem is that when trying to consume this endpoint, which are the resources, it shows me this error:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.lang.Integer from Object value (token JsonToken.START_OBJECT); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type java.lang.Integer from Object value (token JsonToken.START_OBJECT) at [Source: (org.springframework. util.StreamUtils$NonClosingInputStream); line: 1, column: 2]]

By leaving my controller like this, it returns a response that there are invalid parameters and returns null

 @PostMapping(value = "/emision-pesos", consumes = "application/json", produces = "application/json")
    public ResponseEntity<EmisionPesosDto> emisionPesos(@RequestHeader("Authorization") String accessToken,
                                                        @RequestBody EmisionPesosBody emisionPesosBody){
       EmisionPesosDto response = emisionPesoService.postEmisionPesos(emisionPesosBody, accessToken);
       return ResponseEntity.ok(response);
    }

{ "code": 400, "message": "Parámetro inválido", "payload": { "fiscaliaRegional": null, "ruc": null, "rue": null, "fiscaliaZonal": null, "codigoMoneda": null, "plazo": null, "codSubProducto": null, "fechaVencimiento": null, "montoOrgIntPeriodo": null, "tasaPeriodo": null, "numOperacion": null, "monto": null, "montoFinalOrg": null, "codProducto": null, "fechaEmision": null, "montoOrigen": null, "tasaBase": null } }

Swagger Documentation:

Request
{
  "CodigoMoneda": 999,
  "Plazo": 7,
  "MontoDeposito": 105000,
  "IndicadorRenovacion": "S",
  "RutCliente": 61935400,
  "DigitoRutCliente": "1",
  "NumCuentaCorriente": 23909000386,
  "RUC": "000022010212467",
  "RUE": "000000012229907",
  "FiscaliaRegional": "005",
  "FiscaliaZonal": "000500",
  "RutUsuarioEmisor": 12878658,
  "DigitoRutUsuarioEmisor": "9"
}

Response

{
  "CodigoMoneda": 999,
  "Plazo": 7,
  "MontoDeposito": 105000,
  "IndicadorRenovacion": "S",
  "RutCliente": 61935400,
  "DigitoRutCliente": "1",
  "NumCuentaCorriente": 23909000386,
  "RUC": "000022010212467",
  "RUE": "000000012229907",
  "FiscaliaRegional": "005",
  "FiscaliaZonal": "000500",
  "RutUsuarioEmisor": 12878658,
  "DigitoRutUsuarioEmisor": "9"
}

That is what I have in the documentation that the client gave me

like image 624
Pablo bustamante Avatar asked Mar 03 '26 17:03

Pablo bustamante


1 Answers

The version emisionPesos(@RequestHeader("Authorization") String accessToken, @RequestBody EmisionPesosBody emisionPesosBody) is correct.

The other version with multiple arg annotated as @RequestBody is wrong - only one arg can be @RequestBody. The first arg is an integer so the deserialiser, which gets an object start, ie ”{“ and not an integer, complains.

You will have to check the api definition for desa-dapinstituciones.bancoestado.cl to sort out the missing parameters. Do you have a swagger doc for the POST to api-gtw-emision-pesos/dap-min-pub/emision-pesos. ?

like image 126
John Williams Avatar answered Mar 05 '26 10:03

John Williams



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!