Java 映射数据到DTO/VO对象的有效方法
我有一个带有值的映射,我想将这些值映射到DTO 除了使用if-else条件和映射到DTO对象之外,还有更好的方法吗 这是我的密码Java 映射数据到DTO/VO对象的有效方法,java,Java,我有一个带有值的映射,我想将这些值映射到DTO 除了使用if-else条件和映射到DTO对象之外,还有更好的方法吗 这是我的密码 public class Test { public static void main(String[] args) { HashMap<String , Object> hashMap = new HashMap<String , Object>(); hashMap.put("empName
public class Test {
public static void main(String[] args) {
HashMap<String , Object> hashMap = new HashMap<String , Object>();
hashMap.put("empName", "Pavan");
hashMap.put("deptNO", "12");
hashMap.put("country", "IND");
hashMap.put("age", "34");
// TODO Auto-generated method stub
Set<String> keys = hashMap.keySet();
for(String key: keys){
Employee emp = new Employee();
if(key.equals("empName"))
emp.setName(hashMap.get("empName"))
}
}
}
public class Employee {
private String empName ;
private String deptNO ;
private String country ;
private String age ;
// setters and getters
}
有更好的方法吗?您可以为Employee类提供一个参数化构造函数
public class Employee {
private String empName;
private String deptNO;
private String country;
private String age;
Employee(String empName, String deptNO, String country, String age){
this.empName = empName;
this.deptNO = deptNO;
this.country = country;
this.age = age;
}
}
您可以从地图创建Employee对象
public class Test {
public static void main(String[] args) {
HashMap<String , Object> hashMap = new HashMap<String , Object>();
hashMap.put("empName", "Pavan");
hashMap.put("deptNO", "12");
hashMap.put("country", "IND");
hashMap.put("age", "34");
Employee emp = new Employee(hashMap.get("empName"), hashMap.get("deptNO"), hashMap.get("country"), hashMap.get("age"));
}
}
公共类测试{
公共静态void main(字符串[]args){
HashMap HashMap=新的HashMap();
hashMap.put(“empName”、“Pavan”);
hashMap.put(“deptNO”,“12”);
hashMap.put(“国家”、“行业”);
hashMap.put(“年龄”,“34”);
Employee emp=新员工(hashMap.get(“empName”)、hashMap.get(“deptNO”)、hashMap.get(“国家”)、hashMap.get(“年龄”);
}
}
编辑:如果map中有许多字段,可以在Employee类中使用hashmap来获取现有属性
public class Employee {
private HashMap<String, Object> hashMap;
Employee(HashMap<String, Object> hashMap){
this.hashMap = hashMap;
}
public Object getProperty(String propertyName){
return hashMap.get(propertyName);
}
}
公共类员工{
私有HashMap;
员工(HashMap HashMap){
this.hashMap=hashMap;
}
公共对象getProperty(字符串propertyName){
返回hashMap.get(propertyName);
}
}
您可以使用BeanUtils.populate将HashMap键复制到bean,下面是一个示例:
import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
public class Test {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
HashMap<String , Object> hashMap = new HashMap<String , Object>();
hashMap.put("empName", "Pavan");
hashMap.put("deptNO", "12");
hashMap.put("country", "IND");
hashMap.put("age", "34");
EmployeeDTO employeeDTO = new EmployeeDTO();
BeanUtils.populate(employeeDTO,hashMap);
System.out.println(employeeDTO);
}
}
请在此处阅读更多信息:
EmployeeMapper
@Mapper
public interface EmployeeMapper {
EmployeeMapper MAPPER = Mappers.getMapper(EmployeeMapper.class);
@Mapping(expression = "java(parameters.get(\"empName\"))", target = "empName")
@Mapping(expression = "java(parameters.get(\"deptNO\"))", target = "deptNO")
@Mapping(expression = "java(parameters.get(\"country\"))", target = "country")
@Mapping(expression = "java(parameters.get(\"age\"))", target = "age")
Employee map(final Map<String, String> parameters);
}
这不是你想要的那么简洁,但它确实起作用了。另一种方法是使用限定符
,如前所述Qualifier
方法冗长,不能完全解决您的问题,因为您仍然需要为每个字段定义映射
MapStruct
目前不完全支持从Map
进行转换,并且存在一个长时间的和挂起的映射。该映射包含15个字段,以及任何其他计划?@Pavan您是如何创建此映射的?它是在您的代码中创建的吗?来自api调用,来自第三方。然后,您可以直接从api响应创建POJO,或者您可以在Employee类中保存此映射,并创建一个通用的getProperty(String propertyName)
如果值存在,则从map返回propertyName
的值。OP要求从HashMap
映射到bean。BeanUtils.copyProperties(user,userDTO)是如何实现的代码>解决那个问题?说得好,@Pankaj!我已经更正了我的答案,以便它使用正确的BeanUtils方法并更新了提供的示例。
EmployeeDTO{empName='Pavan', deptNO='12', country='IND', age='34'}
@Mapper
public interface EmployeeMapper {
EmployeeMapper MAPPER = Mappers.getMapper(EmployeeMapper.class);
@Mapping(expression = "java(parameters.get(\"empName\"))", target = "empName")
@Mapping(expression = "java(parameters.get(\"deptNO\"))", target = "deptNO")
@Mapping(expression = "java(parameters.get(\"country\"))", target = "country")
@Mapping(expression = "java(parameters.get(\"age\"))", target = "age")
Employee map(final Map<String, String> parameters);
}
Employee employee = EmployeeMapper.MAPPER.map(hashMap);