2017-08-25 119 views
0

我想从REST web服务中获取Json对象的列表。我能够做实际的GET请求,但是当春天试图反序列化,我得到以下异常对象:我在使用弹簧检索Jsonobjects列表时收到异常RESTtemplate

org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 1] 
     at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:228) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:213) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:884) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:868) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:622) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:526) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     at nl.enshore.chatstreamer.service.SmartsuppRestServiceImpl.listTriggers(SmartsuppRestServiceImpl.java:36) ~[main/:na] 
     at nl.enshore.chatstreamer.smack.TSmackMessageHandler.handleChatMessage(TSmackMessagr.java:81) ~[main/:na] 
     at nl.enshore.chatmanager.listeners.HandledMessageListener.processMessage(HandledMessageListener.java:32) ~[enshore-chat-connection-1.1.2.jar:1.1.2] 
     at org.jivesoftware.smack.chat.Chat.deliver(Chat.java:180) ~[smack-im-4.1.0.jar:4.1.0] 
     at org.jivesoftware.smack.chat.ChatManager.deliverMessage(ChatManager.java:351) ~[smack-im-4.1.0.jar:4.1.0] 
     at org.jivesoftware.smack.chat.ChatManager.access$300(ChatManager.java:53) ~[smack-im-4.1.0.jar:4.1.0] 
     at org.jivesoftware.smack.chat.ChatManager$2.processPacket(ChatManager.java:162) ~[smack-im-4.1.0.jar:4.1.0] 
     at org.jivesoftware.smack.AbstractXMPPConnection$4.run(AbstractXMPPConnection.java:1126) ~[smack-core-4.1.0.jar:4.1.0] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131] 
     at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131] 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 1] 
     at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:854) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:850) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:292) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:227) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217) ~[jackson-databind-2.6..6.1]:2 
     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3702) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2798) ~[jackson-databind-2.6.1.jar:2.6.1] 
     at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:225) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
     ... 18 common frames omitted 

这里是我想要检索JSON对象列表的例子:

{ 
    "records": [{ 
    "id": 563, 
    "active": true, 
    "name": "1st visit greeting", 
    "description": "Greeting message to a visitor who visits your website for the 1st time" 
    }, { 
    "id": 564, 
    "active": false, 
    "name": "2st visit greeting", 
    "description": "Greeting message to a visitor who visits your website for the 2nd time" 
    }] 
} 

继承人POJO我用于将jsonObjects转换为Java对象。

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Trigger { 

    private long id; 

    @JsonProperty("name") 
    private String triggerName; 

    private String description; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getTriggerName() { 
     return triggerName; 
    } 

    public void setTriggerName(String triggerName) { 
     this.triggerName = triggerName; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Override 
    public String toString() { 
     return "Trigger{" + 
       "id=" + id + 
       ", triggerName='" + triggerName + '\'' + 
       ", description='" + description + '\'' + 
       '}'; 
    } 
} 

和继承人我做的服务类使用弹簧REST模板来发出GET请求。

@Service 
public class SmartsuppRestServiceImpl implements SmartsuppRestService { 

    private final RestTemplate restTemplate; 

    @Autowired 
    public SmartsuppRestServiceImpl(RestTemplate restTemplate){ 
     this.restTemplate = restTemplate; 
    } 

    @Override 
    public List<Trigger> listTriggers(String accountId){ 
     HttpHeaders apiKeyHeader = new HttpHeaders(); 
     apiKeyHeader.set("apiKey", "************"); 
     HttpEntity entity = new HttpEntity(apiKeyHeader); 

     ResponseEntity<List<Trigger>> getResponse = restTemplate.exchange("https://api.smartsupp.com/accounts/****/triggers" 
       , HttpMethod.GET, entity, new ParameterizedTypeReference<List<Trigger>>(){}); 
     return getResponse.getBody(); 
    } 

    // public Trigger getTrigger(int triggerId){} 



} 

(参数accountId被故意忽略,我为了测试目的硬编码了url中的accountID)。

任何人都可以看到我做错了什么?

谢谢。

+0

只是一个小侧面说明:我想'@ Autowired'成员'restTemplate'直接摆脱'SmartsuppRestServiceImpl'的 –

回答

2

事实上,您的JSON不是一个列表,而是一个带有records字段的对象。

创建一个包装类

public class TriggerRecordsWrapper { 
    List<Trigger> records; 
} 

解析JSON或改编JSON代表名单。

0

将实现Serializable添加到您的触发器对象。这个代码添加到您的AppConfig文件:

@Bean 
    public ObjectMapper objectMapper() { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     return objectMapper; 
    }