Невозможно создать экземпляр `com.test.FilterModel`. Нет конструктора аргумента строки / метода фабрики для десериализации из значения String - PullRequest
0 голосов
/ 21 января 2019

У меня есть реализация с Jackson Object mapper следующим образом:

public void getFilterTest(){
    String filterJSON = "{\"SelectOptions\":[{\"key\":\"status\",\"options\":[{\"sign\":\"eq\",\"value\":\"FAILED\"},{\"sign\":\"eq\",\"value\":\"ESCALATED\"}]}]}";
    ObjectMapper objectMapper = new ObjectMapper();
    FilterModel filters = null;
    try {
        filters = objectMapper.convertValue(filterJSON, FilterModel.class);
    }catch(Exception e) {
        e.printStackTrace();
    }
    assertNotNull(filters);}

При выполнении convertValue я получаю следующую ошибку:

java.lang.IllegalArgumentException: не удается построитьэкземпляр com.Test.FilterModel (хотя существует хотя бы один создатель): нет конструктора аргумента String / метода фабрики для десериализации из значения String ('{"SelectOptions": [{"key": "status", "options": [{"sign": "eq", "value": "FAILED"}, {"sign": "eq", "value": "ESCALATED"}]}]} ') в [Source: UNKNOWN;строка: -1, столбец: -1] в com.fasterxml.jackson.databind.ObjectMapper._convert (ObjectMapper.java:3750) в com.fasterxml.jackson.databind.ObjectMapper.convertValue (ObjectMapper.java:3668) в com.test.util.(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org..runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.Methoho ().java: 17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate (RunBeforeTestExecutionCallbacks.java:74) в org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate (RunAfterTestExecutionCallbacks.java:84) в org.junit.internal.runners.statefore:e.ej ()в org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate (RunBeforeTestMethodCallbacks.java:75) в org.springframework.test.context.junit4.statements.RunAfteralljj.test.context.junit4.statements.(SpringJUnit4ClassRunner.java:251) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:97) в org.junit.runners.ParentRunava.jr2.runners.ParentRunner $ 1.schedule (ПаrentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.Parent(0internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:86) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) в org.eclipse.jdt.ternal.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:538) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java: 760) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:460) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.main)Вызвано: com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможнопостроить экземпляр com.test.FilterModel (хотя в существует хотя бы один создатель): нет конструктора / фабрики с аргументом строки метод десериализации из строкового значения ( "{ "Выберите Функции": [{ "ключ": "Статус", "варианты": [{ "знак": "эк", "значение": "FAILED"}, { "знак": "эк",» значение ":" эскалация "}]}]} ') в [Источник: НЕИЗВЕСТНО; строка: -1, столбец: -1] в com.fasterxml.jackson.databind.exc.MismatchedInputException.from (MismatchedInputException.java:63) в com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch (DeserializationContext.java:1343) в com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator (DeserializationContext.java:1032) в com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks (ValueInstantiator.java:371) в com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString (StdValueInstantiator.java:323) в com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString (BeanDeserializerBase.java:1373) в com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther (BeanDeserializer.java:171) в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:161) в com.fasterxml.jackson.databind.ObjectMapper._convert (ObjectMapper.java:3745) ... еще 34

Вот мои классы моделей: Модель фильтра:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"SelectOptions"
})
public class FilterModel {

@JsonProperty("SelectOptions")
private List<SelectOption> selectOptions = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("SelectOptions")
public List<SelectOption> getSelectOptions() {
return selectOptions;
}

@JsonProperty("SelectOptions")
public void setSelectOptions(List<SelectOption> selectOptions) {
this.selectOptions = selectOptions;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

Класс SelectOptions:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"key",
"options"
})
public class SelectOption {

@JsonProperty("key")
private String key;
@JsonProperty("options")
private List<Option> options = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("key")
public String getKey() {
return key;
}

@JsonProperty("key")
public void setKey(String key) {
this.key = key;
}

@JsonProperty("options")
public List<Option> getOptions() {
return options;
}

@JsonProperty("options")
public void setOptions(List<Option> options) {
this.options = options;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

Вариант модели класса:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"sign",
"value"
})
public class Option {

@JsonProperty("sign")
private String sign;
@JsonProperty("value")
private String value;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("sign")
public String getSign() {
return sign;
}

@JsonProperty("sign")
public void setSign(String sign) {
this.sign = sign;
}

@JsonProperty("value")
public String getValue() {
return value;
}

@JsonProperty("value")
public void setValue(String value) {
this.value = value;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

Я попробовал несколько решений по другим вопросам, но не смог найти решение. Похоже, вся строка JSON считается нормальной строкой. Однако я не уверен, как решить эту проблему. Мне нужен класс FilterModel, так как я ожидаю более 1 параметра, в отличие от строки в приведенном выше тестовом примере.

1 Ответ

0 голосов
/ 21 января 2019

Вы должны вызвать readValue метод.

filters = objectMapper.readValue(filterJSON, FilterModel.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...