3
respostas

[Dúvida] Problema com API da FIPE

Srs,

estou fazendo um projeto para consumir as APIs da FIPE, a de marcas funciona mas a de modelos não, estou tomando um erro meio na cara mas não achei a solução ainda....segue

  • com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type: java.util.ArrayList<br.com.magnum.fipe.model.Modelo> from Object value (token JsonToken.START_OBJECT) at [Source: (String)"{"modelos":[{"codigo":655,"nome":"Aerostar Mini-Van 3.8"},{"codigo":656,"nome":"Aspire 1.3"},{"codigo":657,"nome":"Belina GL 1.8 / 1.6"},....

Quandou vou converter o json com o método abaixo, estoura o erro acima:

 public <T> List<T> obterLista(String json, Class<T> classe) {
    CollectionType lista = mapper.getTypeFactory()
            .constructCollectionType(List.class, classe);
    try {
        return mapper.readValue(json, lista);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}
  • Quando mudo para outro método que não retorna uma lista, não preenche os campos do objeto Modelo:

id = null codigo = null nome = null

    @Override
public <T> T obterDados(String json, Class<T> classe) {
    try {
        return mapper.readValue(json, classe);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}

**Codigo que converte json e salva:**
var modeloLista = converte.obterDados(json, Modelo.class);
repository.save(modeloLista);

java.sql.SQLIntegrityConstraintViolationException: Column 'codigo' cannot be null

Meu objeto Modelo.java

@Entity @Table(name = "modelos") @JsonIgnoreProperties(ignoreUnknown = true) public class Modelo {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long codigo;
private String nome;

public Modelo() {
}

public Modelo(List<Modelo> modelo) {
}

public Modelo(Modelo modelo) {
    this.codigo = modelo.codigo;
    this.nome = modelo.nome;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Modelo modelo = (Modelo) o;
    return Objects.equals(id, modelo.id);
}

@Override
public int hashCode() {
    return Objects.hash(id);
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public Long getCodigo() {
    return codigo;
}

public String getNome() {
    return nome;
}

}

3 respostas

O problema parece estar na deserialização do JSON para a lista de modelos. O JSON fornecido indica que você tem um objeto que contém uma lista de modelos, e o código atual está tentando desserializar diretamente para uma lista de modelos. Vamos ajustar o código para lidar com a estrutura do JSON corretamente.

Atualize o método obterLista para tratar a estrutura correta do JSON:

public <T> List<T> obterLista(String json, Class<T> classe) {
    try {
        JavaType type = mapper.getTypeFactory().constructParametricType(List.class, classe);
        return mapper.readValue(json, type);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}

Em seguida, ao usar esse método para obter a lista de modelos, ajuste o código da seguinte forma:

List<Modelo> modeloLista = converte.obterLista(json, Modelo.class);
repository.saveAll(modeloLista);

Certifique-se de usar saveAll em vez de save ao lidar com uma lista de entidades.

Essas alterações devem resolver o problema de desserialização e permitir que você salve a lista de modelos no banco de dados sem a exceção de integridade.

Oi Carlos,

muito obrigado pela explicação, agora funcionou!!

Márcio.

Fico contente por ter contribuído para esclarecer a sua dúvida. Estou à disposição para qualquer outra questão!

Um abraço,

Se este post foi útil, por favor, considere marcá-lo como solucionado ✓. Desejo a você excelentes estudos!