gpt4 book ai didi

java - 将 DTO 转换为参数列表

转载 作者:行者123 更新时间:2023-12-01 16:45:34 32 4
gpt4 key购买 nike

public class CreateCustomerRequest {
private String fName;
private String lName;
private String gender;
private String address1;
private String address2;
private String mobileNo;
}

我有上述请求 DTO。当我收到此请求时我需要什么然后我需要 convert this DTO with List<String> fields;哪里List<String> objects包含{fName, lName, gender, address1, address2, mobileNo}

请建议我如何实现这一目标。没有任何想法。

最佳答案

基于反射,如果您将字段公开,下面的代码可以工作,如果您想将它们设为私有(private)而不是设置字段,您可以通过构造函数将其转换。

public class CreateCustomerRequest {
public String fName;
public String lName;
public String gender;
public String address1;
public String address2;
public String mobileNo;
}


public static void main(String[] args) throws Throwable {
List<String> param = new ArrayList<String>();
param.add("fnameValue");
param.add("lNameValue");
param.add("genderValue");
param.add("address1Value");
param.add("address2Value");
param.add("mobileNoValue");
CreateCustomerRequest object = convert(param, CreateCustomerRequest.class);
System.out.println("Gender : " + object.gender);
}

public static <T extends Object> T convert(List<String> param, Class<T> clazz) throws Throwable
{
Constructor<?> ctor = clazz.getConstructor();
T result = (T) ctor.newInstance();
Field[] fields = result.getClass().getFields();
if(fields == null)
return null;
for(int i =0;i<fields.length;i++)
{
if(fields[i].getType().equals(String.class))
{
if(param.size() > i)
fields[i].set(result, param.get(i));
}
}
return result;
}

干杯。

编辑

为了将 DTO 类字段设为私有(private)并通过 getter 方法读取它们,我编辑了答案以支持它。

更改:

  1. 将 result.getClass().getFields() ---> result.getClass().getDeclaredFields() 转换为能够读取私有(private)字段。
  2. 在为字段设置值之前调用 fields[i].setAccessible(true)。
  3. 通过 getter 读取字段值 --> System.out.println("Gender : "+ object.getGender());

所以 DTO 类的新代码是:

public class CreateCustomerRequest {
private String fName;
private String lName;
private String gender;
private String address1;
private String address2;
private String mobileNo;

public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
}

转换代码是:

public static void main(String[] args) throws Throwable {
List<String> param = new ArrayList<String>();
param.add("fnameValue");
param.add("lNameValue");
param.add("genderValue");
param.add("address1Value");
param.add("address2Value");
param.add("mobileNoValue");
CreateCustomerRequest object = convert(param, CreateCustomerRequest.class);
System.out.println("Gender : " + object.getGender());
}

public static <T extends Object> T convert(List<String> param, Class<T> clazz) throws Throwable
{
Constructor<?> ctor = clazz.getConstructor();
T result = (T) ctor.newInstance();
Field[] fields = result.getClass().getDeclaredFields();
if(fields == null)
return null;

for(int i =0;i<fields.length;i++)
{
if(fields[i].getType().equals(String.class))
{
if(param.size() > i)
{
fields[i].setAccessible(true);
fields[i].set(result, param.get(i));
}
}
}
return result;
}

关于java - 将 DTO 转换为参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52089769/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com