ModelMapper-将Collection <object>中的Date转换为String(java)

时间:2018-07-09 15:06:42

标签: java entity converter dto modelmapper

我在这个论坛和其他网站上进行了很多搜索,但是我仍然遇到问题。

我实际上是在使用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,却找不到(或者可能理解吗?)任何可能对我有帮助的响应。

谢谢

1 个答案:

答案 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);