6

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

4 回答 4

13

两个选项,要么你提供一个默认的无参数构造函数来完成这项工作。但是,对于您的用例,@JsonCreator@JsonProperty提供了更好的解决方案恕我直言:

public class ErrorHolder
{
    public String errorMessage;

    @JsonCreator
    public ErrorHolder(@JsonProperty("errorMessage") String errorMessage)
    {
        this.errorMessage = errorMessage;
    }

    // getters and setters
 }
于 2013-06-12T19:27:50.127 回答
3

我相信你需要像这样向你的类添加一个无参数构造函数:ErrorHolder

public ErrorHolder(){
   this(null);
}
于 2013-06-12T18:50:21.680 回答
1

反序列化过程(将流转换为 java 对象)将访问默认构造函数,该构造函数为继承层次结构中未实现接口 Serializable 的第一个类调用。

因此,您需要解决的只是一个默认构造函数(无 args/无参数)。这篇文章将帮助您更好地理解:https ://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html#4539

于 2014-11-14T22:17:37.277 回答
0

我需要添加一个虚拟构造函数

public ErrorHolder(){
}
于 2013-06-12T18:52:10.627 回答