我在这个论坛和其他网站上进行了很多搜索,但是我仍然遇到问题。
我实际上是在使用modelmapper将实体转换为DTO。
这里是实体:
@Entity
public class Candidate implements Serializable {
@Id
@GeneratedValue (strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column (name = "name")
private String lastname;
@Column (name = "firstname")
private String firstname;
@Column (name = "phone")
private String phoneNumber;
@Column (name = "mail")
private String email;
@Column (name = "title")
private int title;
@OneToMany (mappedBy = "candidateId")
private Collection<Candidature> Interviews;
这里是候选实体(您在第一个实体的集合中找到):
public class Candidature implements Serializable {
@Id
@NotBlank
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn (name = "candidat_id")
private Candidate candidateId;
@Column(name = "interview")
@Temporal (TemporalType.DATE)
private Date dateInterview;
@Column(name ="status")
private String status;
这是DTO:
public class CandidateDTO {
private Long id;
private String lastname;
private String firstname;
private String phoneNumber;
private String email;
private String title;
private String dateLastInterview;
如您所见,存在一些差异。
我面临的问题是DTO(dateLastInterview
)的最后一个属性来自Collection<Candidature>
,更确切地说,它必须是转换为String的最后一个dateInterview
。
将日期转换为字符串不是问题。无法获取集合的最后一项。
但是我无法使其与modelMapper一起使用。 这是我尝试过的示例代码:
modelMapper = new ModelMapper();
Converter<Candidate, CandidateDTO> converter = new Converter<Candidate, CandidateDTO>()
{
@Override
public CandidateDTO convert(MappingContext<Candidate, CandidateDTO> mappingContext) {
Candidate candidate = mappingContext.getSource();
CandidateDTO cdto = new CandidateDTO();
List<Candidature> list = (List) candidate.getInterviews();
Date date = list.get(list.size()-1).getDateInterview();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String dateInterviewConverted = df.format(date);
mappingContext.getDestination().setTitle(mappingContext.getSource().getTitle());
mappingContext.getDestination().setDateLastInterview(dateInterviewConverted);
return cdto;
}
};
modelMapper.createTypeMap(Candidate.class, CandidateDTO.class).setConverter(converter);
(我尝试过,而不是上面的最后一行:modelMapper.addConverter(converter);
但结果相同)
但是它不起作用,我将所有属性设置为null。
我以前成功使用
map().setTitle(source.getTitle());
map().setDateLastInterview(dateInterviewConverted);
然后在我的DTO“设置”方法中将“日期”转换为“字符串”,但似乎不应该将其转换为ModelMapper类或使用它的类。
你有个主意吗?我是modelMapper的新手,并且我一直在浏览google,却找不到(或者可能理解吗?)任何可能对我有帮助的响应。
谢谢
答案 0 :(得分:0)
好吧,我想我成功了。 使用转换器是正确的事情,但是我没有正确使用它。对于转换器,放在<>内的两个对象是转换器关注的属性。
例如,对于第一个转换器,我想将Collection(来自对象Candidate)的转换参数化为String(以匹配DTO的属性)。
因此,您只需要使用Class和ClassDTO创建一个PropertyMap,在configure()方法中,您仅提及将使用特殊参数的属性(其他属性则是正确的,因为它们遵循标准映射)。 / p>
Converter<Collection<Candidature>, String> convertLastDateToString = new Converter<Collection<Candidature>, String>() {
public String convert(MappingContext<Collection<Candidature>, String> context) {
List<Candidature> candidatureList = (List)context.getSource();
String dateInterviewConverted = "";
if (candidatureList.size() > 0) {
Date lastInterview = candidatureList.get(0).getDateInterview();
for (int i = 0; i < candidatureList.size(); i++) {
if (candidatureList.get(i).getDateInterview().after(lastInterview)) {
lastInterview = candidatureList.get(i).getDateInterview();
}
}
// converts the Date to String
DateFormat df = new SimpleDateFormat(DATE_FORMAT);
dateInterviewConverted = df.format(lastInterview);
}
return dateInterviewConverted;
}
};
// allows custom conversion for Title attribute
// the source (Candidate) has a title attribute in int type
// the destination (CandidateDTO) has a title attributes in String type
Converter<Integer, String> convertTitleToString = new Converter<Integer, String>(){
public String convert(MappingContext<Integer, String> context){
return Title.values()[context.getSource()].toString();
}
};
// define explicit mappings between source and destination properties
// does only concernes the attributes that will need custom mapping
PropertyMap<Candidate, CandidateDTO> candidateMapping = new PropertyMap<Candidate, CandidateDTO>()
{
protected void configure()
{
// to map these two attributes, they will use the corresponding converters
using(convertTitleToString).map(source.getTitle()).setTitle(null);
using(convertLastDateToString).map(source.getCandidatures()).setDateLastInterview(null);
}
};
// add the mapping settings to the ModelMapper
modelMapper.addMappings(candidateMapping);