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;
}
}
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
.
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;
}