Я работаю над приложением весенней загрузки и разрабатываю службу весеннего отдыха (PATCH).
У меня есть ситуация, когда мне нужно сопоставить данные, полученные по запросу PATCH в HashMap из внешнего интерфейса, в класс POJO java.
Атрибуты, которые мне нужно отобразить в классе POJO, присутствуют в ключе Hashmap. Нам нужно выполнить итерацию по карте и связать значение ключа на карте с атрибутом класса POJO.
Как лучше всего это сделать? Я знаю, что есть очень сложный способ, когда я вручную проверяю каждый ключ на карте и связываю соответствующее значение с соответствующим установщиком в классе POJO. Но это чрезвычайно громоздко, если количество атрибутов в классе POJO велико.
Есть ли эффективный способ добиться этого?
Фрагмент кода
@CrossOrigin
@RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
public Project editProject(@RequestBody Map<String, String> project, @PathVariable("id") String id) throws Exception {
logger.info("Inside editProject() API ");
if (project == null) {
return null;
}
for(String key: project.keySet()) {
logger.info("Keys passed for update ==> Key(" + key + "): Value(" + project.get(key) + ")");
}
Project projectRec = null;
try {
logger.info("updateProject() :: Before save :: ");
projectRec = projectService.updateProjectInfo(project, id);
logger.info("updateProject() :: After save :: Saved successfully ::: ", projectRec.toString());
}
catch (Exception ex) {
ex.printStackTrace();
throw ex;
}
logger.info("Leaving createProject() API");
return projectRec;
}
public Project updateProjectInfo(Map<String, String> projectRec, String id) {
logger.info("Inside updateProjectInfo() API in ProjectServiceImpl");
Project dbRec = projectRepository.findOne(id);
setAttributesfromMaptoDBRec(projectRec, dbRec);
Project updatedProjectRec = null;
logger.info(" Leaving updateProjectInfo() API in ProjectServiceImpl");
return updatedProjectRec;
}
private void setAttributesfromMaptoDBRec(Map<String, String> updatedProjectRecMap, Project updatedProjectRec) {
logger.info(" Inside setAttributesfromMaptoDBRec() API in ProjectServiceImpl");
Set<String> nonUpdateableAttributes = ProjectServiceImpl.nonUpdateableKeys.get(ProjectServiceImpl.nonUpdateable);
if (updatedProjectRecMap == null) {
logger.warn(" Input Map to service is null in ProjectServiceImpl ===> " + (updatedProjectRecMap == null));
return;
}
for(String key: updatedProjectRecMap.keySet()) {
logger.info(" Project property ===> " + key);
logger.info(" nonUpdateableAttributes contains key ===> " + nonUpdateableAttributes.contains(key));
if (!nonUpdateableAttributes.contains(key)) {
try {
System.out.println("Field name: " + updatedProjectRec.getClass().getField(key));
System.out.println("HOW TO AUTOMATICALLY SET THE ATTRIBUTE TO THE POJO CLASS BASED ON THE KEY ??");
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
Я сделал это задолго до использования Jackson objectMapper.readObject и writeObject.




Я сделал нечто подобное давно, используя API привязки данных Джексона. Не уверен, но это может быть полезно:
import java.util.Map;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectMarshalUtility {
public static <T> Map marshalObject(T obj){
ObjectMapper oMapper = new ObjectMapper();
oMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
return oMapper.convertValue(obj, Map.class);
}
public static <T> T unMarshalObject(Class<T> classType, Map<String, Object> map){
ObjectMapper oMapper = new ObjectMapper();
oMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
return oMapper.convertValue(map, classType);
}
}
Для преобразования DTO в MAP:
Map<String,Object> searchInputMap=ObjectMarshalUtility.marshalObject(searchInputDTO);
Для преобразования карты в DTO:
SearchInputDTO searchInputDTO=ObjectMarshalUtility.unMarshalObject(searchInputMap);
Если ключи на карте совпадают с именами свойств POJO, вы можете попробовать использовать отражение