Получение JsonMappingException при отправке данных для просмотра

я пытаюсь показать данные БД на своей веб-странице. Я сделал следующий код, когда получите запрос @RequestMapping(value = "/api/binder").

но когда get-запрос пришел к этому методу, он будет получать данные (у меня есть печать на консоли и хорошо отображается), но он не сопоставляется с моим Java-скриптом 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"])

вот вызов ajax из нокаута js:

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

здесь BinderView and BinderResponse имеют те же поля:

    private String binderName;
    private String binderAddress1;

геттер и сеттер, а также в оба. и repository.genBinders() метод приносит данные из БД.

вот метод вставки и отлично работает для меня:

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

}

в консоли, он печатает данные / 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;
    }
}

и метод 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;
    }
}

2 ответов


Jackson по умолчанию сериализует всю иерархию наследования объекта, т. е. поля родительского класса также. В случае

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"])

Джексон пытается сериализовать поле под названием valid С getter под названием isValid (это обычное имя свойства компонента). Однако метод getter, похоже, бросает NullPointerException по какой причине.

если вы хотите, чтобы Джексон проигнорировал его, вы можете аннотировать геттер с помощью @JsonIgnore или свой класс @JsonIgnoreProperties и указать имя свойства, т. е. valid.


 @Column(name="createddate")  
 private Date createdDate; 

 @Transient
 private String formatedCreatedDate;  


public String getFormatedCreatedDate() {
    DateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
    return dateFormat.format(this.getCreatedDate());
}

он выдает то же исключение, потому что здесь может быть null, вызывая getCreatedDate () значение, поэтому он не может форматировать нулевую дату, поэтому держите нулевую проверку здесь, как:

решение

public String getFormatedCreatedDate() {
    DateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
    Date createDdate=this.getCreatedDate();
    **if(createDdate!=null){
        return  dateFormat.format(createDdate);
    }**
    return "-";
}