Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射数据到DTO/VO对象的有效方法_Java - Fatal编程技术网

Java 映射数据到DTO/VO对象的有效方法

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

我有一个带有值的映射,我想将这些值映射到DTO

除了使用if-else条件和映射到DTO对象之外,还有更好的方法吗

这是我的密码

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);