我已经使用Spring Rest开发了以下代码。
我的代理
public Respuesta reject(Integer id,Integer uid, Integer asociation, String reason,Integer type, Cuestionario cuestionario){
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(METHOD_REJECT_FULLPATH);
Map<String,Serializable> map = new HashMap<String,Serializable>(2);
map.put("cuestionario",cuestionario);
map.put("motivo",motivo);
ResponseEntity<RespuestaServidor> respuesta = restTemplate.exchange(builder.buildAndExpand(id,uid,type, idTipo,asociation).encode().toUri(),
HttpMethod.POST,
new HttpEntity<Map<String,Serializable>>(map),
new ParameterizedTypeReference<Respuesta>(){});
return respuesta.getBody();
}
URI调用此方法。
@RequestMapping(value = Proxy.METHOD_REJECT,method = RequestMethod.POST)
public @ResponseBody
ResponseEntity<Respuesta>reject(@PathVariable Integer id,@PathVariable Integer uid,@PathVariable Integer asociation, @PathVariable Integer type,@RequestBody(required=false)Map<String,Object>map){
final String motivo = (String)map.get("motivo");
final Cuestionario cuestionario = (Cuestionario)map.get("cuestionario");
问题是在这条线
final Cuestionario cuestionario = (Cuestionario)map.get("cuestionario");
下面给出的是Cuestionario POJO
public class Cuestionario implements Serializable {
private static final long serialVersionUID = -2669540728368524646L;
private String respuesta1;
private String respuesta2;
private String respuesta3;
private String respuesta4;
private boolean fullfilled;
为此,我得到以下异常
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.Cuestionario
我在类似该问题的其他文章中已经读过,指出这是一种JAVA怪癖,而其他意见则指出可以使用映射器来检索/广播Cuestionario对象。但是由于我在REST方面的专业知识较少,因此我不知道有任何映射器。
我希望有人能帮助我。我有一个非常相似的代码,但有一个
Map<List<Integer>,List<Integer>>
并且工作完美。但这对于Cuestionario来说是失败的。我也尝试过使用Spring LinkedMultiValueMap,但这也不起作用。
MultiValueMap<String,Serializable> map = new LinkedMultiValueMap<String, Serializable>(2);
map.add("motivo",motivo);
map.add("cuestionario",cuestionario);
我需要在某个地方解析请求主体并从数据构造一个Cuestionario实例,但是我该怎么做。
最佳答案
您正在尝试将Object
强制转换为Cuestionario
,这是行不通的
@RequestMapping(value = Proxy.METHOD_REJECT,method = RequestMethod.POST)
public @ResponseBody
ResponseEntity<Respuesta>reject(@PathVariable Integer id,@PathVariable Integer uid,@PathVariable Integer asociation, @PathVariable Integer type,@RequestBody(required=false)Map<String,Object>map){
final String motivo = (String)map.get("motivo");
// Here map is of type Map<String, Object>
final Cuestionario cuestionario = (Cuestionario)map.get("cuestionario");
您必须手动反序列化响应正文。
由于您使用的是Spring,因此您的依赖项中可能已经包含Jackson。您可以扩展
JsonDeserializer
public class CuestionarioDeserializer extends JsonDeserializer<Cuestionario> {
@Override
public Cuestionario deserialize(JsonParser parser, DeserializationContext context) throws IOExcention {
//Your deserialization logic
}
}
然后像这样注释您的
Cuestionario
:@JsonDeserialize(using = YourCuestionarioDeserializer.class)
public class Cuestionario
或执行相同的操作,但反序列化为DTO,然后使用DTO创建一个Cuestionario