为什么我得到org.codehaus.jackson.map.JsonMappingException:没有为类型找到合适的构造函数

时间:2013-06-12 18:41:17

标签: java spring rest spring-mvc

有人可以告诉我为什么我会收到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]

4 个答案:

答案 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(){
}