如何将结果集映射到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"
}
我正在尝试的代码:
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 存储库
例外情况非常简单 - DTO 中的某些字段类型缺少字符串构造函数,即“
MarketingInfo
”
此外,您所采用的代码并不意味着默认情况下会填充嵌套对象,您应该考虑一些 ORM 或自己的工厂。