it-source

볼 데이터를 보내는 동안 JsonMappingException을 가져오는 중

criticalcode 2023. 8. 29. 20:42
반응형

볼 데이터를 보내는 동안 JsonMappingException을 가져오는 중

제 웹 페이지에 DB 데이터를 표시하려고 합니다.GET 요청 시 다음 코드를 작성했습니다.@RequestMapping(value = "/api/binder").

그러나 get request가 이 메서드에 오면 데이터를 가져올 것입니다(콘솔에 인쇄되어 있고 잘 표시됩니다). 그러나 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.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;
    }
}

바인더 보기:

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

그리고 독립체에서:

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

WebApi 응답 기반:

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은 기본적으로 개체의 전체 상속 계층, 즉 상위 클래스 필드를 직렬화합니다.의 경우에는

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

잭슨은 다음과 같은 필드를 연재하려고 합니다.valida부터getter불렀다isValid(일반적인 콩 속성 이름).하지만, 더 나은 방법은, 그것을 던지는 것처럼 보입니다.NullPointerException이유야 어떻든

잭슨이 그것을 무시하기를 원한다면, 당신은 Getter에 주석을 달 수 있습니다.@JsonIgnore또는 당신의 수업과@JsonIgnoreProperties속성 이름을 지정합니다.valid.

제 경우에는 사용할 때@JsonIgnore예외는 사라졌지만 문제는 그 값을 받을 수 없다는 것이었습니다.API Request더 이상 그리고 스프링은 그것을 무시했습니다 (분명히 그것 때문입니다).@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;
}
 @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());
}

여기서 getCreatedDate() 값이 null일 수 있으므로 null 날짜를 형식으로 지정할 수 없으므로 다음과 같이 null 확인을 유지합니다.

해결책

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

언급URL : https://stackoverflow.com/questions/22853509/getting-jsonmappingexception-while-sending-data-to-view

반응형