MapStruct Impl无法生成正确的映射

时间:2020-11-09 12:14:42

标签: mapstruct

qualifiedByName映射无法生成正确的impl文件。

代码:

HospitalMapper.java

    package com.company.tracker.hospitals.vo.mapper;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.Named;

import com.company.tracker.hospitals.entity.HospitalDetails;
import com.company.tracker.hospitals.vo.HospitalDetailsDTO;

@Mapper(componentModel = "spring", uses = {DateFormatConversion.class,ObjectAfterMapping.class }, config = AuditMapper.class)
public interface HospitalDetailsMapper {


    @Mappings({

            @Mapping(source = "creationDate", target = "creationDate", qualifiedByName = "withDateFormatConversion"),

            @Mapping(source = "lastModifiedDate", target = "lastModifiedDate", qualifiedByName = "withDateFormatConversion") })
    HospitalDetails hospitalDetailsDTOToHospitalDetails(HospitalDetailsDTO hospitalDetailsDTO);
    
    @Mappings({

            @Mapping(source = "creationDate", target = "creationDate", qualifiedByName = "StringToDateFormat"),

            @Mapping(source = "lastModifiedDate", target = "lastModifiedDate", qualifiedByName = "StringToDateFormat") })

    HospitalDetailsDTO hospitalDetailsToHospitalDetailsDTO(HospitalDetails hospitalDetails);


    List<HospitalDetailsDTO> hospitalDetailsToHospitalDetailsDTO(List<HospitalDetails> hospitalDetails);

    List<HospitalDetails> hospitalDetailsDTOToHospitalDetails(List<HospitalDetails> hospitalDetailsDTO);
    
    @Named("withDateFormatConversion")
     default LocalDate withDateFormatConversion(String date) throws ParseException {
          ZoneId defaultZoneId = ZoneId.systemDefault();
            System.out.println("System Default TimeZone : " + defaultZoneId);

            Date date1=new SimpleDateFormat("dd-MM-yyyy").parse(date);  
            //1. Convert Date -> Instant
            Instant instant = date1.toInstant();

            //2. Instant + system default time zone + toLocalDate() = LocalDate
            return instant.atZone(defaultZoneId).toLocalDate();
              
    }
}

DateFormatConversion.java:

    package com.company.tracker.hospitals.vo.mapper;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

import org.mapstruct.Named;
import org.springframework.stereotype.Component;

@Component
public class DateFormatConversion {
    @Named("withDateFormatConversion")
    public LocalDate withDateFormatConversion(String date) throws ParseException {
          ZoneId defaultZoneId = ZoneId.systemDefault();
            System.out.println("System Default TimeZone : " + defaultZoneId);

            Date date1=new SimpleDateFormat("dd-MM-yyyy").parse(date);  
            //1. Convert Date -> Instant
            Instant instant = date1.toInstant();

            //2. Instant + system default time zone + toLocalDate() = LocalDate
            return instant.atZone(defaultZoneId).toLocalDate();
              
    }
    
}

生成的代码:

    package com.company.tracker.hospitals.vo.mapper;

import com.company.tracker.hospitals.entity.HospitalDetails;
import com.company.tracker.hospitals.vo.HospitalDetailsDTO;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-11-09T17:22:28+0530",
    comments = "version: 1.3.0.Final, compiler: Eclipse JDT (IDE) 3.21.0.v20200304-1404, environment: Java 1.8.0_261 (Oracle Corporation)"
)
@Component
public class HospitalDetailsMapperImpl implements HospitalDetailsMapper {

    @Autowired
    private ObjectAfterMapping objectAfterMapping;

    @Override
    public HospitalDetails hospitalDetailsDTOToHospitalDetails(HospitalDetailsDTO hospitalDetailsDTO) {
        if ( hospitalDetailsDTO == null ) {
            return null;
        }

        HospitalDetails hospitalDetails = new HospitalDetails();

        try {
            if ( hospitalDetailsDTO.getCreationDate() != null ) {
                hospitalDetails.setCreationDate( new SimpleDateFormat().parse( hospitalDetailsDTO.getCreationDate() ) );
            }
        }
        catch ( ParseException e ) {
            throw new RuntimeException( e );
        }
        try {
            if ( hospitalDetailsDTO.getLastModifiedDate() != null ) {
                hospitalDetails.setLastModifiedDate( new SimpleDateFormat().parse( hospitalDetailsDTO.getLastModifiedDate() ) );
            }
        }
        catch ( ParseException e ) {
            throw new RuntimeException( e );
        }
        hospitalDetails.setCreatedBy( hospitalDetailsDTO.getCreatedBy() );
        hospitalDetails.setIsDeleted( hospitalDetailsDTO.getIsDeleted() );
        hospitalDetails.setLastModifiedBy( hospitalDetailsDTO.getLastModifiedBy() );
        hospitalDetails.setAddress1( hospitalDetailsDTO.getAddress1() );
        hospitalDetails.setAddress2( hospitalDetailsDTO.getAddress2() );
        hospitalDetails.setAddress3( hospitalDetailsDTO.getAddress3() );
        hospitalDetails.setCity( hospitalDetailsDTO.getCity() );
        hospitalDetails.setDistrict( hospitalDetailsDTO.getDistrict() );
        hospitalDetails.setHospitalId( hospitalDetailsDTO.getHospitalId() );
        hospitalDetails.setHospitalName( hospitalDetailsDTO.getHospitalName() );
        hospitalDetails.setLandmark( hospitalDetailsDTO.getLandmark() );
        hospitalDetails.setRegistrationId( hospitalDetailsDTO.getRegistrationId() );
        hospitalDetails.setStreetName( hospitalDetailsDTO.getStreetName() );

        return hospitalDetails;
    }

    @Override
    public HospitalDetailsDTO hospitalDetailsToHospitalDetailsDTO(HospitalDetails hospitalDetails) {
        if ( hospitalDetails == null ) {
            return null;
        }

        HospitalDetailsDTO hospitalDetailsDTO = new HospitalDetailsDTO();

        if ( hospitalDetails.getCreationDate() != null ) {
            hospitalDetailsDTO.setCreationDate( new SimpleDateFormat().format( hospitalDetails.getCreationDate() ) );
        }
        if ( hospitalDetails.getLastModifiedDate() != null ) {
            hospitalDetailsDTO.setLastModifiedDate( new SimpleDateFormat().format( hospitalDetails.getLastModifiedDate() ) );
        }
        hospitalDetailsDTO.setCreatedBy( hospitalDetails.getCreatedBy() );
        hospitalDetailsDTO.setIsDeleted( hospitalDetails.getIsDeleted() );
        hospitalDetailsDTO.setLastModifiedBy( hospitalDetails.getLastModifiedBy() );
        hospitalDetailsDTO.setAddress1( hospitalDetails.getAddress1() );
        hospitalDetailsDTO.setAddress2( hospitalDetails.getAddress2() );
        hospitalDetailsDTO.setAddress3( hospitalDetails.getAddress3() );
        hospitalDetailsDTO.setCity( hospitalDetails.getCity() );
        hospitalDetailsDTO.setDistrict( hospitalDetails.getDistrict() );
        hospitalDetailsDTO.setHospitalId( hospitalDetails.getHospitalId() );
        hospitalDetailsDTO.setHospitalName( hospitalDetails.getHospitalName() );
        hospitalDetailsDTO.setLandmark( hospitalDetails.getLandmark() );
        hospitalDetailsDTO.setRegistrationId( hospitalDetails.getRegistrationId() );
        hospitalDetailsDTO.setStreetName( hospitalDetails.getStreetName() );

        HospitalDetailsDTO target = objectAfterMapping.test( hospitalDetails, hospitalDetailsDTO );
        if ( target != null ) {
            return target;
        }

        return hospitalDetailsDTO;
    }

    @Override
    public List<HospitalDetailsDTO> hospitalDetailsToHospitalDetailsDTO(List<HospitalDetails> hospitalDetails) {
        if ( hospitalDetails == null ) {
            return null;
        }

        List<HospitalDetailsDTO> list = new ArrayList<HospitalDetailsDTO>( hospitalDetails.size() );
        for ( HospitalDetails hospitalDetails1 : hospitalDetails ) {
            list.add( hospitalDetailsToHospitalDetailsDTO( hospitalDetails1 ) );
        }

        return list;
    }

    @Override
    public List<HospitalDetails> hospitalDetailsDTOToHospitalDetails(List<HospitalDetails> hospitalDetailsDTO) {
        if ( hospitalDetailsDTO == null ) {
            return null;
        }

        List<HospitalDetails> list = new ArrayList<HospitalDetails>( hospitalDetailsDTO.size() );
        for ( HospitalDetails hospitalDetails : hospitalDetailsDTO ) {
            list.add( hospitalDetails );
        }

        return list;
    }
}

如果我检查生成的代码,则createdDate和lastModifiedDate没有使用DateFormatConversion.class withDateFormatConversion方法。

但是它使用简单的日期格式将最后修改日期设置为

hospitalDetails.setLastModifiedDate( new SimpleDateFormat().parse( hospitalDetailsDTO.getLastModifiedDate() ) );

为什么impl生成的文件没有选择DateFormatConversion.class来映射createdDate和lastModifiedDate?

1 个答案:

答案 0 :(得分:0)

Annotation类型的JavaDoc Mapper谈到了“ uses”属性:

此映射器使用的其他映射器类型。可能是MapStruct生成的手写类或其他映射器。

您的Bean“ DateFormatConversion”可能没有被标识为手写映射器类。
您还可以创建一个带@Mapper注释的接口DateFormatConversion,并提供一个默认方法,该方法的代码与withDateFormatConversion中的方法相同。