将结果集映射到Java对象(POJO),然后比较实际响应,即已经转换为Java对象(POJO)

问题描述 投票:0回答:1

如何将结果集映射到Java对象(POJO),然后与实际响应进行比较,即已经转换为Java对象(POJO)

我面临的主要问题是 SQL 列类型与 POJO 不同。 现在例如:具有以下响应的营销信息将创建一个单独的 POJO,但在数据库中它被映射为字符串。

API响应如下:

{
    "uuid": "00a26ea4-6be3-47dd-8ee6-2f52a71d98b6",
    "email": "[email protected]",
    "firstName": "Pulkit",
    "lastName": "Agrawal",
    "businessName": "MMIS Test 1709386721967",
    "phoneNumber": "4029559455",
    "marketingInfo": {
        "utm_campaign": "Commerce_WhereToBuy"
    },
    "resellerUuid": "47HMNNZ9BPF8E",
    "order": {
        "uuid": "366ae541-899b-420a-9112-0897406bf7ae",
        "hasSubscriptions": false,
        "planId": "4NKNCTE5RGV5P",
        "planName": "Counter Service Restaurant",
        "keyedInRate": {
            "percentage": 3.5,
            "fixedAmount": {
                "value": 0.20,
                "currencyCode": "USD"
            }
        },
        "inPersonRate": {
            "percentage": 2.3,
            "fixedAmount": {
                "value": 0.10,
                "currencyCode": "USD"
            }
        },
        "shippingAddress": {
            "lineOne": "131 Varick St",
            "lineTwo": "11",
            "city": "New York",
            "state": "NY",
            "zipCode": "10014"
        },
        "items": [
            {
                "uuid": "64e2172d-bd99-4dcc-8f04-b39d24f64614",
                "fdmpId": "777-1000108721",
                "displayName": "Flex",
                "purchaseType": "P",
                "quantity": 1,
                "price": {
                    "value": 599.00,
                    "currencyCode": "USD"
                },
                "digitalCatalogId": "FLEX_GEN_3"
            },
            {
                "uuid": "ff873f43-09d6-4fd6-9613-78703e1b1b19",
                "fdmpId": "93183",
                "displayName": "Station Solo",
                "purchaseType": "P",
                "quantity": 1,
                "price": {
                    "value": 1699.00,
                    "currencyCode": "USD"
                },
                "digitalCatalogId": "STATION_SOLO_CASH_DRAWER"
            }
        ]
    },
    "salesforceId": "00Q8J000001uPewUAE",
    "salesforceOwnerId": "00G7j000001EdZdEAK",
    "chainAgentId": "526975216882",
    "clAnalyticsId": "d356c4dec6af56976d667364b3f41b6e779dde2aaf027edf9cfe74cf288505f0",
    "modifiedTime": "2024-03-02T13:38:43.908+00:00"
}

SQL 结果如下:

我正在尝试的代码:

public class SubmitApp extends BaseTest {

@Test
public void shouldBeAbleToCreateLead() throws SQLException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
    Lead requestCreateLead = leadBuilder();
    Response response = LeadAPI.put(requestCreateLead);
    assertThat(response.statusCode(), equalTo(StatusCode.CODE_200.getCode()));
    LeadResponse actualResponseLead = response.as(LeadResponse.class);

    ResultSet rs = dbConnection();
    List<LeadResponse> responseList = convertSQLResultSetToObject(rs, LeadResponse.class);
}

public static <T> List<T> convertSQLResultSetToObject(ResultSet resultSet, Class<T> clazz) throws SQLException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
        field.setAccessible(true);
    }
    List<T> list = new ArrayList<>();
    while (resultSet.next()) {

        T dto = clazz.getConstructor().newInstance();

        for (Field field : fields) {
            String name = field.getName();

            try {
                String value = resultSet.getString(name);
                field.set(dto, field.getType().getConstructor(String.class).newInstance(value));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        list.add(dto);
    }
    return list;
}


@Step
public Lead leadBuilder() {
    Lead lead = new Lead();
    return lead;
}

最后一行出现如下错误:

java.lang.NoSuchMethodException: com.spotify.oauth2.pojo.LeadResponse.MarketingInfo.<init>(java.lang.String)

P.S:代码的 Github 链接:放心 Github 存储库

java automation
1个回答
1
投票

例外情况非常简单 - DTO 中的某些字段类型缺少字符串构造函数,即“

MarketingInfo

此外,您所采用的代码并不意味着默认情况下会填充嵌套对象,您应该考虑一些 ORM 或自己的工厂。

© www.soinside.com 2019 - 2024. All rights reserved.