簡體   English   中英

http.converter.HttpMessageNotReadableException:無法讀取文檔:無法從START_OBJECT令牌中反序列化java.lang.String實例

[英]http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.lang.String out of START_OBJECT token

我正在嘗試讀取json請求,然后創建響應。 請求屬於“ Request.java”,響應屬於“ WsResponse.java”。 WsResponse.java鏈接到contacts.java。 使用郵遞員時,可以實現適當的響應。 但是當嘗試通過客戶端調用來調用方法時,它給出了異常

"Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@44c8afef; line: 1, column: 14] (through reference chain: com.websystique.springmvc.model.Request["contacts"]->java.util.ArrayList[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@44c8afef; line: 1, column: 14] (through reference chain: com.websystique.springmvc.model.Request["contacts"]->java.util.ArrayList[0])
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:227)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:212)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:622)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:380)
    at com.websystique.springmvc.Test.main(Test.java:49)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@44c8afef; line: 1, column: 14] (through reference chain: com.websystique.springmvc.model.Request["contacts"]->java.util.ArrayList[0])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:810)
    at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:190)
    at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:161)
    at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:19)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
    at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:335)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:142)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3562)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2662)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:224)
    ... 6 more"

給出以下類:

public class Request {
        @JsonProperty
        private String blocking;
        @JsonProperty
        private String module;
        @JsonProperty("contacts")
        private List<String> contacts;

        public Request(){

        }

        public String getBlocking() {
            return blocking;
        }

        public void setBlocking(String blocking) {
            this.blocking = blocking;
        }

        public String getModule() {
            return module;
        }

        public void setModule(String module) {
            this.module = module;
        }

        public List<String> getContacts() {
            return contacts;
        }

        public void setContacts(List<String> contacts) {
            this.contacts = contacts;
        }

        @Override
        public String toString() {
            return "Request [blocking=" + blocking + ", module=" + module + ", contacts=" + contacts + "]";
        }
    } 



public class WsResponse {

    @JsonProperty("contacts")
    private List<contacts> contacts;

    public WsResponse() {
    }

    public List<contacts> getContacts() {
        return contacts;
    }

    public void setContacts(List<contacts> contacts) {
        this.contacts = contacts;
    }

    @Override
    public String toString() {
        return "[contacts:" + contacts + "]";
    }


public class contacts {
        private String input;
        private String status;
        private String wa_id;

        public contacts() {
        }

        public String getInput() {
            return input;
        }

        public void setInput(String input) {
            this.input = input;
        }

        public String getStatus() {
            return status;
        }

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

        public String getWa_id() {
            return wa_id;
        }

        public void setWa_id(String wa_id) {
            this.wa_id = wa_id;
        }

        @Override
        public String toString() {
            return "{input=" + input + ", status=" + status + ", wa_id=" + wa_id + "}";
        }
    }

public class Test {

    public static void main(String[] args) throws JSONException {
        final String uriForPost = "http://localhost:8080/Spring4MVCCRUDRestService/getContactDetails/";

        ArrayList<String> contactList = new ArrayList<String>();
        contactList.add("9315551000");
        contactList.add("9315551002");
        contactList.add("931-555-1005");
        contactList.add("031-555-1005");

        Request req = new Request();
        req.setBlocking("wait");
        req.setModule("Model_A");
        req.setContacts(contactList);

        RestTemplate restTemplate = new RestTemplate();
        restTemplate.postForObject(uriForPost, req, Request.class);
    }
}

這是我的請求JSON:

  {
        "blocking": "wait",
        "module":"Model_A",
        "contacts": [    
            "7855222121",
            "988542d1222",
            "9029674116",
            "5252525252",
            "213123123123"
        ]
    }

回應(從郵遞員致電后):

{
    "contacts": [
        {
            "input": "7855222121",
            "status": "valid",
            "wa_id": "7855222121"
        },
        {
            "input": "988542d1222",
            "status": "valid",
            "wa_id": "988542d1222"
        },
        {
            "input": "9029674116",
            "status": "valid",
            "wa_id": "9029674116"
        },
        {
            "input": "5252525252",
            "status": "valid",
            "wa_id": "5252525252"
        },
        {
            "input": "213123123123",
            "status": "valid",
            "wa_id": "213123123123"
        }
    ]
}

在Stackoverflow和其他可用站點上嘗試了以下解決方案:

1. using @JsonProperty on fields
2. Passing JSON object instead of Request class object


JSONObject json = new JSONObject();
    json.put("blocking", "wait");
    json.put("module", "Model_A");

    ArrayList<String> contactList = new ArrayList<String>();
    contactList.add("6315551000");
    contactList.add("6315551002");
    contactList.add("631-555-1005");
    json.put("contacts", contactList);

3.Adding below code for convertor

    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
            messageConverters.add(new FormHttpMessageConverter());
            messageConverters.add(new StringHttpMessageConverter());
            //messageConverters.add(new MappingJacksonHttpMessageConverter());
            restTemplate.setMessageConverters(messageConverters);

4.

    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM));
            restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);

任何提示或線索都會有所幫助。

謝謝

您的代碼中有一個錯字(我認為),您期望響應為Request.class ,而您必須將其映射到WsResponse.class

// wrong mapping of response to Request.class
restTemplate.postForObject(uriForPost, req, Request.class);

// correct mapping
WsResponse res = restTemplate.postForObject(uriForPost, req, WsResponse.class);

由於出現在請求和響應中的contacts字段會導致異常,但是在請求中,它是字符串數組,而在響應中,它是對象數組(contact類),因此當傑克遜嘗試將響應json反序列化為Request#contacts時 ,它會找到起始對象標記{,但它期望使用字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM