我工作的弹簧引导应用程序和开发弹簧安置(补丁)服务。
我有一个情况,我需要从前端到Java POJO类上PATCH请求中接收一个HashMap中的数据进行映射。
我需要在POJO类映射属性存在于HashMap中的关键。我们需要通过地图迭代,并在地图上的POJO类属性的关键价值相关联。
做这个的最好方式是什么?我知道有一个非常leborious方式,我手动检查地图中的每个键和相应的值在POJO类相应的setter关联。但是,这是如果该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();
}
}
}
}
我已经做了类似的事情早就回了杰克逊使用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<String,Object> searchInputMap=ObjectMarshalUtility.marshalObject(searchInputDTO);
用于将映射到DTO:
SearchInputDTO searchInputDTO=ObjectMarshalUtility.unMarshalObject(searchInputMap);