gpt4 book ai didi

java - ModelMapper 与 Jooq Record 集成

转载 作者:行者123 更新时间:2023-11-29 08:59:11 26 4
gpt4 key购买 nike

===== POJO =====

// Employee POJO
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class Employee implements Serializable {
private Integer id;
private String name;
private Integer companyId;
// assume getters ,setters and serializable implementations.
}
// Company POJO
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class Company implements Serializable {
private Integer id;
private String name;
// assume getters ,setters and serializable implementations.
}

// EmployeeVO POJO
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class EmployeeVO implements Serializable {
private Employee employee;
private Company company;

// assume getters ,setters and serializable implementations.
}

===== 我的DAO层类 =====

public List<EmployeeVO> getEmployees(){     
// configuring model mapper.
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.addValueReader(new RecordValueReader())
.setSourceNameTokenizer(NameTokenizers.UNDERSCORE);

//property map configuration.
PropertyMap<Record, EmployeeVO> employeeVOMap = new PropertyMap<Record, EmployeeVO>() {
protected void configure() {
map().getEmployee().setName(this.<String>source("name"));
map().getEmployee()..setId(this.<Integer>source("id"));
map().getCompany().setName(this.<String>source("comp_name"));
map().getCompany().setId(this.<String>source("comp_id"));
}
};
// TypeMap config
modelMapper.createTypeMap(Record.class, EmployeeVO.class);
// adding employeeVOMap .
modelMapper.addMappings(employeeVOMap);

// JOOQ query
List<Field<?>> fields = Lists.newArrayList();
// fields includes, id, name, comp_name, comp_id

SelectJoinStep query = select(dslContext, fields).from(EMPLOYEE)
.join(COMPANY)
.on(COMPANY.ID.equal(EMPLOYEE.COMPANY_ID));
Result<Record> records = query.fetch();

Record record = null;
Iterator<Record> it = records.iterator();
List<EmployeeVO> employeeList= Lists.newArrayList();
while (it.hasNext()) {
record = it.next();

EmployeeVO employeeVOObj =
modelMapper.map(record, EmployeeVO.class);
employeeList.add(employeeVOObj);
}
return employeeList;
}

===== 错误日志 =====

1) 错误 mapping org.jooq.impl.RecordImpl to com.myportal.bingo.db.model.EmployeeVO 1 个错误] 有根本原因 java.lang.ArrayIndexOutOfBoundsException: -1

注意:ModelMapper 在到达下面的方法时抛出上面的异常。

private void matchSource(TypeInfo<?> sourceTypeInfo, Mutator destinationMutator)ImplicitMappingBuilder.java

sourceTypeInfo.getAccessors() is null.

有什么帮助吗?

最佳答案

有同样的问题,或者至少看起来是一样的。 (你可以直接跳到我最后一段的解决方案。)大量调试显示如下:

如果该行上的访问器(在您的问题中提到)为空,则执行 TypeInfoImpl 类中的 accessors = PropertyInfoSetResolver.resolveAccessors(source, type, configuration) 行,异常原因在我的情况是这个电话:

valueReader.get(source, memberName) 在 PropertyInfoSetResolver 类的“resolveAccessors”方法中的以下代码中:

if (valueReader == null)
resolveProperties(type, true, configuration, accessors);
else {
NameTransformer nameTransformer = configuration.getSourceNameTransformer();
for (String memberName : valueReader.memberNames(source))
accessors.put(nameTransformer.transform(memberName, NameableType.GENERIC),
new ValueReaderPropertyInfo(valueReader, valueReader.get(source, memberName),
memberName));

source.getValue(memberName.toUpperCase()) 中结束,其中 source 是 JOOQ 的 Record;在我的例子中是 InvoiceRecord。而且 - tada - 由于某种原因 invoice.getValue("INVOICE_ID") 以异常结束(没有这样的字段,因此 indexOf 返回 -1 导致 ArrayIndexOutOfBoundsException),而 invoice.getValue("invoice_id") 完全没问题。

所以 else 条件(上面的同一段代码)不是执行代码的正确方式,而 if 情况证明是可以的。

这就是在我的特殊情况下对我有帮助的原因:删除 modelMapper.getConfiguration().addValueReader(new RecordValueReader()) 行。希望这对您也有帮助。

关于java - ModelMapper 与 Jooq Record 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18534170/

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