3 回答
TA贡献1831条经验 获得超10个赞
首先,定义用于映射请求对象的 POJO:
public class RequestObj implements Serializable{
private List<Long> ids;
private UsuarioDTO user;
/* getters and setters here */
}
public class UsuarioDTO implements Serializable{
private String name;
private String email;
/* getters and setters here */
}
然后修改您的端点:
@PostMapping(value = "/sendToOficial")
public ResponseEntity<?> sendToOficial(@RequestBody RequestObj payload) {
通过这种方式,您也不需要使用ObjectMapper. 就打电话payload.getIds()。
还要考虑这样,如果有效负载发生变化,您只需要更改RequestObj定义,而使用ObjectMapper会强制您以一种重要的方式更新端点。将有效载荷表示与控制逻辑分开会更好也更安全。
TA贡献1936条经验 获得超6个赞
在jackson-databind-2.6.x及更高版本中,您可以使用配置功能ObjectMapper将低类型int值(适合 32 位的long值)配置为序列化值DeserializationFeature#USE_LONG_FOR_INTS:
@PostMapping(value = "/sendToOficial")
public ResponseEntity<?> sendToOficial(@RequestBody Map<String, Object> payload) {
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature .USE_LONG_FOR_INTS, true);
List<Long> pointsIds = mapper.convertValue( payload.get("pointsIds"), List.class );
UsuarioDTO autorAlteracao = mapper.convertValue(payload.get("user"), UsuarioDTO.class);
for (Long idPoint : pointsIds) { // ... }
}
TA贡献1799条经验 获得超6个赞
如果您只想让映射器读入List<Long>,请使用此技巧通过子类化获取完整的泛型类型信息。
例子
ObjectMapper mapper = new ObjectMapper();
List<Long>listOfLong=mapper.readValue("[ 123421, 15643, 51243]" ,
new TypeReference<List<Long>>() {
});
System.out.println(listOfLong);
印刷
[123421, 15643, 51243]
添加回答
举报