web-dev-qa-db-fra.com

Obtention de JsonMappingException lors de l'envoi de données à afficher

J'essaie d'afficher les données DB sur ma page Web. J'ai fait le code suivant lorsque GET demande à la @RequestMapping(value = "/api/binder").

mais lorsque la demande get est arrivée à cette méthode, elle récupérera les données (j'ai bien imprimé sur la console et bien afficher) mais elle ne correspond pas à mon Java appel Script Ajax, cela me montre une erreur.

Voici mon code pour récupérer des données:

    @Autowired
    IBinderViewRepository repository;

    @RequestMapping(method= RequestMethod.GET)
    public @ResponseBody
    List<BinderResponse> getBinders(){
        List<BinderView> binders = repository.getBinders();
        List<BinderResponse> responses = new ArrayList<>();
        ModelMapper mapper = Mapper.getInstance();

        for(int i = 0; i < binders.size(); i++){
            System.out.println("In Loop");
            BinderResponse response = mapper.map(binders.get(i),BinderResponse.class);
            System.out.println("Data :: " + response.getBinderName());
            responses.add(response);
        }
        return responses;
    }

mais cela me montre l'erreur suivante:

HTTP Status 500 - Could not write JSON: (was Java.lang.NullPointerException) (through reference chain: Java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was Java.lang.NullPointerException) (through reference chain: Java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"])

Voici un appel ajax de knockout js:

ajax.get('api/binder').done(function(response){ ... }

Ici BinderView and BinderResponse Ont les mêmes champs:

    private String binderName;
    private String binderAddress1;

et getter setter ainsi dans les deux. et la méthode repository.genBinders() récupère les données de la BD.

Voici la méthode d'insertion et fonctionne bien pour moi:

    @RequestMapping(method= RequestMethod.POST,consumes = "application/json")
    public @ResponseBody
    IWebApiResponse addBinder(@RequestBody AddBinderForm binder){
        .....
    }

Dois-je mettre n'importe quel json annotation on my BinderResponse class ?

Je ne comprends pas où je me trompe? Quelqu'un me guide.

MISE À JOUR:

public class BinderResponse extends WebApiResponseBase {
    private String binderName;
    private String binderAddress1;

public String getBinderName() {
        return binderName;
    }

    public void setBinderName(String binderName) {
        this.binderName = binderName;
    }

    public String getBinderAddress1() {
        return binderAddress1;
    }

    public void setBinderAddress1(String binderAddress1) {
        this.binderAddress1 = binderAddress1;
    }
}

BinderView:

    public class BinderView extends BaseView {
        private String binderName;
        private String binderAddress1;
    public String getBinderName() {
            return binderName;
        }

        public void setBinderName(String binderName) {
            this.binderName = binderName;
        }

        public String getBinderAddress1() {
            return binderAddress1;
        }

        public void setBinderAddress1(String binderAddress1) {
            this.binderAddress1 = binderAddress1;
        }

}

Dans la console, il imprime les données/BinderName:

In Loop
Data :: ada
In Loop
Data :: tya

Nouvelle mise à jour:

Voici BaseView:

@MappedSuperclass
public abstract class BaseView implements IEntity {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name="id")
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        if (this.id != 0 && this.id != id) {
            throw new IllegalStateException(
                    "The ID must not be changed after it is set.");
        }
        this.id = id;
    }
}

et In IEntity:

public interface IEntity  extends Serializable {
    long getId();
    void setId(long id);
}

WebApiResponseBase:

public class WebApiResponseBase implements IWebApiResponse {

    private String _uri;

    @Override
    public String getUri() {
        return _uri == null ? "" : _uri;
    }

    @Override
    public void setUri(String uri) {
        _uri = uri;
    }
}
13
user3145373 ツ

Jackson, par défaut, sérialise toute la hiérarchie d'héritage d'un objet, c'est-à-dire. les champs de la classe parent également. Dans le cas de

public class BinderResponse extends WebApiResponseBase {

il semble que

Could not write JSON: (was Java.lang.NullPointerException) (through reference chain: Java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was Java.lang.NullPointerException) (through reference chain: Java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"])

Jackson essaie de sérialiser un champ appelé valid à partir d'un getter appelé isValid (qui est un nom de propriété de bean conventionnel). Cependant, la méthode getter semble lancer un NullPointerException pour une raison quelconque.

Si vous voulez que Jackson l'ignore, vous pouvez annoter le getter avec @JsonIgnore ou votre classe avec @JsonIgnoreProperties et spécifiez le nom de la propriété, c'est-à-dire. valid.

39

Dans mon cas, quand j'ai utilisé @JsonIgnore l'exception a disparu mais le problème est qu'il n'a pas pu recevoir cette valeur de API Request plus et Spring l'a ignoré (évidemment à cause de @JsonIgnore) J'ai donc enquêté sur le problème et compris que le problème était le getter et setter. J'avais la propriété Integer alors que mon getter était int. Donc, quand j'ai changé le getter en Integer mon problème a été résolu et l'erreur a disparu.

private Integer purchaseId;

@JsonIgnore
public int getPurchaseId() {
    return purchaseId;
}

public void setPurchaseId(int purchaseId) {
    this.purchaseId = purchaseId;
}

Changé en :

private Integer purchaseId;


public Integer getPurchaseId() {
    return purchaseId;
}

public void setPurchaseId(Integer purchaseId) {
    this.purchaseId = purchaseId;
}
6
Far Zad