有人可以告诉我为什么我会收到org.codehaus.jackson.map.JsonMappingException:找不到合适错误的合适构造函数?
这是我的电话:
try
{
String jsonreturn = restTemplate.getForObject("http://" + mRESTServer.getHost() + ":8080/springmvc-rest-secured-test/json/{name}", String.class, vars);
LOGGER.debug("return object: " + jsonreturn.toString());
} catch (HttpClientErrorException e)
{
/**
*
* If we get a HTTP Exception display the error message
*/
LOGGER.error("error: " + e.getResponseBodyAsString());
ObjectMapper mapper = new ObjectMapper();
ErrorHolder eh = mapper.readValue(e.getResponseBodyAsString(), ErrorHolder.class);
LOGGER.error("error: " + eh.errorMessage);
}
我试图测试错误,所以我应该创建一个ErrorHolder对象但是我收到了错误;
这是我的ErrorHolder类:
public class ErrorHolder
{
public String errorMessage;
public ErrorHolder(String errorMessage)
{
this.errorMessage = errorMessage;
}
public String getErrorMessage()
{
return errorMessage;
}
public void setErrorMessage(String errorMessage)
{
this.errorMessage = errorMessage;
}
@Override
public String toString()
{
return "ErrorHolder{" +
"errorMessage='" + errorMessage + '\'' +
'}';
}
}
我不知道为什么会收到以下错误:
2013-06-12 14:36:32,138 [main] ERROR Main - error: {"errorMessage":"Uh oh"}
Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class ErrorHolder]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: java.io.StringReader@628016f7; line: 1, column: 2]
答案 0 :(得分:13)
两个选项,要么提供一个默认的无参数构造函数来完成这项工作。但是,对于您的用例,@JsonCreator和@JsonProperty提供了更好的解决方案IMHO:
public class ErrorHolder
{
public String errorMessage;
@JsonCreator
public ErrorHolder(@JsonProperty("errorMessage") String errorMessage)
{
this.errorMessage = errorMessage;
}
// getters and setters
}
答案 1 :(得分:3)
我认为您需要在ErrorHolder
类中添加无参数构造函数,如下所示:
public ErrorHolder(){
this(null);
}
答案 2 :(得分:1)
反序列化过程(将流转换为java对象)将访问为继承层次结构中未实现接口Serializable的第一个类调用的默认构造函数。
因此,您需要解决的所有问题都是默认构造函数(无args / parametersless)。这篇文章将帮助您更好地理解:https://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html#4539
答案 3 :(得分:0)
我需要添加一个虚拟构造函数
public ErrorHolder(){
}