У меня есть требование, при котором некоторые известные данные вместе с неизвестными данными поступают со входа JSON. У меня есть несколько атрибутов, тип данных которых известен, но может быть несколько атрибутов, тип которых будет неизвестен. Ниже представлен объект модели @RequestBody, используемый для отображения JSON input
class User {
private final Map<String, Object> additionalAttributes = new HashMap<>();
@NotBlank
private String name;
private String city;
private Integer age;
@JsonAnySetter
public void addDetail(String key, Object value) {
this.additionalAttributes.put(key, value);
}
public Map<String, Object> getAdditionalAttributes() {
return this.additionalAttributes;
}
}
И ниже - input JSON
{
"name": "abc",
"city": "xyz",
"age": 25,
"zip":765234,
"country": "india",
"NRI" false
}
В приведенном выше примере тип данных ' имя ',' город 'и' возраст 'известны API и, соответственно, они объявлены. Но дополнительные атрибуты (zip, country и NRI) и их значения, которые будут доступны в виде пары ключ-значение на карте, будут нам неизвестны. Поскольку дополнительные атрибуты отображаются на карту, значение может быть любым. В приведенном выше примере JSON значение zip - целое число / длинное, страна - строка, а NRI - логическое.
Теперь для обязательных атрибутов у меня написан класс сущности, так как я знаю имя и тип данных. Эти атрибуты будут храниться в таблице, скажем, 'обязательная_таблица'.
Для необязательных атрибутов (которые мы получаем в качестве пары ключ-значение на карте), у меня может быть новая таблица, называемая "дополнительные_атрибуты" с тремя столбцами, а именно «attributeName», «attributeValue» и «m_id», которые будут внешним ключом для «обязательной_таблицы».
Проблема, с которой я здесь сталкиваюсь, заключается в том, что, поскольку значением атрибута может быть все, что пользователь может передать в качестве ввода JSON, как мне заполнить столбец attributeValue? Для атрибута attributeName проблем нет, поскольку ключ всегда будет String.
@Entity(name = "additional_attributes")
class AdditionalAttributes {
private String attributeName;
private Object attributevalue;
// getter and setter
// manytoone with mandatory table
}
Мне нужно сохранить тип данных attributeValue как Object, поскольку полученное из карты значение будет иметь тип Object.