简体   繁体   English

MapStruct 不同的实现:mvn install vs run

[英]MapStruct different implementations: mvn install vs run

I've a Spring Boot 2.2 project.我有一个 Spring Boot 2.2 项目。 I'm using MapStruct 1.3.1 and Lombook 1.18.12.我正在使用 MapStruct 1.3.1 和 Lombook 1.18.12。

I've these models:我有这些模型:

@EntityListeners({AuditingEntityListener.class})
@MappedSuperclass
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public abstract class AbstractEntity implements Persistable<Long>, Serializable {

//stuff
}

+ +

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
@DiscriminatorValue(value = "AuditLog")
@EntityListeners(AuditLogListener.class)
@NoArgsConstructor
@SuperBuilder
@Data
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
public class AuditLog extends AbstractEntity {
//stuff
}

+ +

@Entity
@DiscriminatorValue(value = "AuditCdr")
@Data
@SuperBuilder
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
public class AuditCdr extends AuditLog {

    @Size(max = 30)
    private String from;

    @Size(max = 30)
    private String to;

    @Enumerated(EnumType.STRING)
    @Size(max = 50)
    private CallType callType;

    private Instant startDate;

    private Instant endDate;

    public AuditCdr() {
        setOperationType(AuditType.CDR);
    }
}

I created this DTO:我创建了这个 DTO:

@Data
@Builder
public class Cdr3CXDto {

    String from;

    String to;

    String type;

    String startDate;

    String endDate;

    Long contactId;
}

and this mapper:这个映射器:

@Mapper(componentModel = "spring")
public interface Cdr3CXMapper {


    @ValueMappings({
            @ValueMapping(source = "Inbound", target = "INBOUND"),
            @ValueMapping(source = "Outbound", target = "OUTBOUND"),
            @ValueMapping(source = "Missed", target = "MISSED"),
            @ValueMapping(source = "Notanswered", target = "NOT_ANSWERED")
    })
    @Mapping(source = "contactId", target = "parentId")
    @Mapping(source = "type", target = "callType")
    AuditCdr cdr3CXDtoToAuditCdr(Cdr3CXDto cdr3CXDto);
}

This is my relevan part of pom.xml这是我 pom.xml 的相关部分

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

I also added dependencies:我还添加了依赖项:

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
            <scope>provided</scope>
        </dependency>

When I run mvn install, mapstructs generate the right implementation for the mapper:当我运行 mvn install 时,mapstructs 会为映射器生成正确的实现:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-04-30T14:09:56+0200",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)
@Component
public class Cdr3CXMapperImpl implements Cdr3CXMapper {

    @Override
    public AuditCdr cdr3CXDtoToAuditCdr(Cdr3CXDto cdr3CXDto) {
        if ( cdr3CXDto == null ) {
            return null;
        }

        AuditCdr auditCdr = new AuditCdr();

        auditCdr.setFrom( cdr3CXDto.getFrom() );
        auditCdr.setTo( cdr3CXDto.getTo() );
        if ( cdr3CXDto.getStartDate() != null ) {
            auditCdr.setStartDate( Instant.parse( cdr3CXDto.getStartDate() ) );
        }
        if ( cdr3CXDto.getEndDate() != null ) {
            auditCdr.setEndDate( Instant.parse( cdr3CXDto.getEndDate() ) );
        }

        return auditCdr;
    }
}

No compiling errors, it's ok.没有编译错误,没关系。 When I do run a JunitTest as in the image, I have a compiling error because the implementation is wrong this time:当我在图像中运行 JunitTest 时,我有一个编译错误,因为这次实现是错误的:

在此处输入图像描述

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-04-30T15:09:29+0200",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)
@Component
public class Cdr3CXMapperImpl implements Cdr3CXMapper {

    @Override
    public AuditCdr cdr3CXDtoToAuditCdr(Cdr3CXDto cdr3CXDto) {
        if ( cdr3CXDto == null ) {
            return null;
        }

        AuditLogBuilder<?, ?> auditCdr = AuditLog.builder();

        auditCdr.parentId( cdr3CXDto.getContactId() );

        return auditCdr.build();
    }
}

It seems MapStruct uses the builder from the parent class and not the child as described in this question .似乎 MapStruct 使用来自父 class 的构建器,而不是这个问题中描述的孩子。 I hope there is a way to instruct mapstruct to generate the right code even when I run a single test in my IntelliJ IDE.我希望有一种方法可以指示 mapstruct 生成正确的代码,即使我在 IntelliJ IDE 中运行单个测试也是如此。

There should be no difference between the execution of the compilation from Maven or from IntelliJ.从 Maven 或 IntelliJ 执行编译应该没有区别。 If there is a difference it might mean that there is some problem with the Lombok @SuperBuilder .如果存在差异,则可能意味着 Lombok @SuperBuilder存在一些问题。

I would try to add the printProcessorInfo and printRounds compiler arguments so that you can see what is happening.我会尝试添加printProcessorInfoprintRounds编译器 arguments 以便您可以看到发生了什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM