IT Share you

입력 끝 잭슨 파서로 인해 매핑 할 콘텐츠가 없습니다.

shareyou 2020. 12. 5. 10:55
반응형

입력 끝 잭슨 파서로 인해 매핑 할 콘텐츠가 없습니다.


이 응답을 서버에서 받고 있습니다. {"status":"true","msg":"success"}

Jackson 파서 라이브러리를 사용 하여이 json 문자열을 구문 분석하려고하는데 어떻게 든 매핑 예외에 직면하고 있습니다.

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: java.io.StringReader@421ea4c0; line: 1, column: 1]

왜 이런 종류의 예외가 발생합니까?

이 예외의 원인을 이해하는 방법은 무엇입니까?

다음과 같은 방법으로 구문 분석을 시도하고 있습니다.

StatusResponses loginValidator = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);

try {
    String res = result.getResponseAsString();//{"status":"true","msg":"success"}
    loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);
} catch (Exception e) {
    e.printStackTrace();
}

StatusResponse 클래스

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "status","msg" })
public class StatusResponses {

    @JsonProperty("status")
    public String getStatus() {
        return status;
    }

    @JsonProperty("status")
    public void setStatus(String status) {
        this.status = status;
    }

    @JsonProperty("msg")
    public String getMessage() {
        return message;
    }

    @JsonProperty("msg")
    public void setMessage(String message) {
        this.message = message;
    }

    @JsonProperty("status")
    private String status;

    @JsonProperty("msg")
    private String message;

    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonGetter
    public Map<String, Object> getAdditionalProperties() {
        return additionalProperties;
    }

    @JsonSetter
    public void setAdditionalProperties(Map<String, Object> additionalProperties) {
        this.additionalProperties = additionalProperties;
    }
}

import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;

StatusResponses loginValidator = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);

try {
    String res = result.getResponseAsString();//{"status":"true","msg":"success"}
    loginValidator = objectMapper.readValue(res, StatusResponses.class);//replaced result.getResponseAsString() with res
} catch (Exception e) {
    e.printStackTrace();
}

어떻게 작동했고 왜 작동했는지 모르십니까? :(하지만 작동했습니다


이 오류를 수정할 수 있습니다. 제 경우에는 문제가 클라이언트 측에있었습니다. 실수로 서버에 쓰는 스트림을 닫지 않았습니다. 나는 스트림을 닫았고 잘 작동했습니다. 오류조차도 서버가 입력 끝을 식별하지 못한 것처럼 들립니다.

OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(jsonstring.getBytes());
out.close() ; //This is what I did

I had a similar error today and the issue was the content-type header of the post request. Make sure the content type is what you expect. In my case a "multipart/form-data" content-type header was being sent to the API instead of "application/json".


In my case I was reading the stream in a jersey RequestEventListener I created on the server side to log the request body prior to the request being processed. I then realized that this probably resulted in the subsequent read to yield no string (which is what is passed over when the business logic is run). I verified that to be the case.

So if you are using streams to read the JSON string be careful of that.


For one, @JsonProperty("status") and @JsonProperty("msg") should only be there only when declaring the fields, not on the setters and geters.

In fact, the simplest way to parse this would be

@JsonAutoDetect  //if you don't want to have getters and setters for each JsonProperty
public class StatusResponses {

   @JsonProperty("status")
   private String status;

   @JsonProperty("msg")
   private String message;

}

참고URL : https://stackoverflow.com/questions/26925058/no-content-to-map-due-to-end-of-input-jackson-parser

반응형