2017-07-28 185 views
0

我需要从Java程序调用RESTful webservice并将它传递给DateTime集合。Spring RestTemplate:如何序列化java.util.Collection

所以,我的代码是这样的:

RestTemplate restTemplate = new RestTemplate(); 
try { 
    String scheme = request.getScheme(); 
    String userInfo = request.getRemoteUser(); 
    String host = request.getLocalAddr(); 
    int port = request.getLocalPort(); 
    String path = "/myapp/common/myapi"; 

    MultiValueMap<String, Object> requestParams = new LinkedMultiValueMap<String, Object>(); 

    requestParams.add("aId", objA.getId()); 
    requestParams.add("bIb", objB.getId()); 

    for (DateTime date : dates) { 
     requestParams.add("dates", date); 
    } 

    URI apiUri = new URI(scheme, userInfo, host, port, path, null, null); 
    result = restTemplate.postForObject(apiUri.toString(), request, BigDecimal.class, 
      requestParams); 
} catch (URISyntaxException e) { 
    logger.error(e.getMessage()); 
} catch (DataAccessException e) { 
    logger.error(e.getMessage()); 
} 

而且Web服务的签名是这样的:

@RequestMapping(value = "myapi", method = RequestMethod.POST) 
public @ResponseBody BigDecimal myApi(
     @RequestParam("dates") final List<DateTime> dates, 
     @RequestParam("aId") final Integer aId, @RequestParam("bId") final Integer bId) { 

    [...] 

    return result; 

} 

但我得到的错误:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class java.util.Collections$3 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

我明白问题是集合的序列化,但我不知道如何解决它。

更新 我也试图与Command类,所以像:

public class CalcolaGiorniResiduiCommand implements Serializable { 
    private List<DateTime> dates; 
    //[...] 
} 

改变控制器:

@RequestMapping(value = "myapi", method = RequestMethod.POST) 
public @ResponseBody BigDecimal myApi(
     @RequestParam("command") final MyCommand command) { 

最后:

MyCommand command = MyCommand.build(1, 1, dates); //dates is a DateTime Collection 
restTemplate.postForObject(apiUri.toString(), request, BigDecimal.class, command); 

但我得到相同的错误。

请帮忙吗?

回答

0

documentation,请求参数是将要发布的对象,所以在命令对象具有作为第二个参数,而不是对象请求传递。

因此,代码应改为从:

restTemplate.postForObject(apiUri.toString(), request, BigDecimal.class, command); 

到:

restTemplate.postForObject(apiUri.toString(), command, BigDecimal.class); 
0
I think you have to pass a list of dateTime object rather than adding it multiple time. Can you please try with the below snippet. 
List<DateTime> dates = new ArrayList<>(); 

for (DateTime date : dates) { 
     dates.add(date); 
    } 
requestParams.add("dates", dates); 
+0

感谢您的回答,但它仍然无法正常工作。 – Alessandro