Java ModelMapper与Jooq记录的集成
====POJO=====Java ModelMapper与Jooq记录的集成,java,jooq,modelmapper,Java,Jooq,Modelmapper,====POJO===== // Employee POJO @JsonInclude(JsonInclude.Include.NON_NULL) @JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) public class Employee implements Serializable { private Integer id; priv
// 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.
}
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;
}
====我的DAO层类=====
// 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.
}
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;
}
有什么帮助吗?有同样的问题,或者至少看起来是一样的。(您可以在最后一段中直接转到我的解决方案。)大量调试显示了以下内容: 如果该行(在您的问题中提到)上的访问器为空,则执行TypeInfoImpl类中的
accessors=PropertyInfoSetResolver.resolveAccessors(源、类型、配置)
line,在我的情况下,异常的原因是此调用:
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的记录;发票记录在我的情况下。和-tada-由于某种原因,invoice.getValue(“invoice_ID”)
最终会出现异常(没有这样的字段,因此indexOf
返回-1
,这会导致ArrayIndexOutOfBoundsException),而invoice.getValue(“invoice_ID”)
完全没有问题
所以else
条件(上面的同一段代码)不是执行代码的正确方法,而且if
情况证明是正确的
这就是在我的特殊情况下帮助我的原因:删除行
modelMapper.getConfiguration().addValueReader(新的RecordValueReader())
。希望这也能对您有所帮助。我删除了该行,但运气不好。该行是modelMapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.下划线)代码>是否仍存在于代码中?好吧,不管怎样,祝你好运!不,我把它注释掉并执行了。顺便说一句,我正在尝试使用联接从两个不同的表中获取所有字段。所以这不仅仅是在表记录上。我认为问题在于(正如您所解释的),RecordValueReader正在尝试将源(Jooq记录)成员名转换为大写,但至少在我的情况下,我将成员名转换为小写。我们是否可以在不忽略RecordValueReader(因为它在转换jooq记录时起作用)的情况下修复此问题?“我们是否可以在不忽略RecordValueReader(因为它在转换jooq记录时起作用)的情况下修复此问题?”-您是对的,这应该很重要,但我看到的唯一解决方案是编辑RecordValueReader类(例如,删除toUpperCase()
fragment),幸运的是它是一个小类,只有36行。