web-dev-qa-db-ja.com

ビューにデータを送信中にJsonMappingExceptionを取得する

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;
    }
}
_
13
user3145373 ツ

ジャクソンは、デフォルトで、オブジェクトの継承階層全体をシリアル化します。親クラスのフィールドも同様です。の場合

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

39

私の場合、@JsonIgnoreを使用したとき、例外はなくなりましたが、問題はAPI Requestからその値を受け取ることができず、Springはそれを無視しました(明らかに@JsonIgnoreのため)問題について調査し、問題がgettersetterであることがわかりました。 Integergetterでしたが、intプロパティがありました。したがって、getterIntegerに変更すると、問題は解決し、エラーはなくなりました。

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;
}
6
Far Zad