WebページにDBデータを表示しようとしています。 @RequestMapping(value = "/api/binder")
へのGETリクエスト時に次のコードを作成しました。
しかし、このメソッドにgetリクエストが来ると、データを取得します(コンソールに印刷して表示します)が、Java Script Ajax呼び出しにマップされず、エラーが表示されます。
以下はデータを取得するための私のコードです:
_ @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;
}
_
しかし、次のエラーが表示されます:
_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"])
_
以下は、ノックアウトjsからのajax呼び出しです。
ajax.get('api/binder').done(function(response){ ... }
ここで_BinderView and BinderResponse
_には同じフィールドがあります:
_ private String binderName;
private String binderAddress1;
_
両方のゲッターセッターも同様です。およびrepository.genBinders()
メソッドは、DBからデータを取り込みます。
ここに挿入メソッドがあり、私にとってはうまくいきます:
_ @RequestMapping(method= RequestMethod.POST,consumes = "application/json")
public @ResponseBody
IWebApiResponse addBinder(@RequestBody AddBinderForm binder){
.....
}
_
_json annotation on my BinderResponse class ?
_を入れなければなりませんか
どこが間違っているのかわかりませんか?.
更新:
_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;
}
}
_
コンソールでdata/BinderNameを出力します:
_In Loop
Data :: ada
In Loop
Data :: tya
_
新しい更新:
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;
}
}
_
および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;
}
}
_
ジャクソンは、デフォルトで、オブジェクトの継承階層全体をシリアル化します。親クラスのフィールドも同様です。の場合
public class BinderResponse extends WebApiResponseBase {
どうやら
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はvalid
(従来のBeanプロパティ名)と呼ばれるgetter
からisValid
と呼ばれるフィールドをシリアライズしようとします。ただし、ゲッターメソッドは、何らかの理由でNullPointerException
をスローするようです。
Jacksonに無視させたい場合は、ゲッターに@JsonIgnore
アノテーションを付けるか、クラスに@JsonIgnoreProperties
アノテーションを付け、プロパティ名を指定できます。 valid
。
私の場合、@JsonIgnore
を使用したとき、例外はなくなりましたが、問題はAPI Request
からその値を受け取ることができず、Springはそれを無視しました(明らかに@JsonIgnore
のため)問題について調査し、問題がgetter
とsetter
であることがわかりました。 Integer
はgetter
でしたが、int
プロパティがありました。したがって、getter
をInteger
に変更すると、問題は解決し、エラーはなくなりました。
private Integer purchaseId;
@JsonIgnore
public int getPurchaseId() {
return purchaseId;
}
public void setPurchaseId(int purchaseId) {
this.purchaseId = purchaseId;
}
変更後:
private Integer purchaseId;
public Integer getPurchaseId() {
return purchaseId;
}
public void setPurchaseId(Integer purchaseId) {
this.purchaseId = purchaseId;
}