当前位置: 首页 > 知识库问答 >
问题:

MapStruct不同的实现:mvn安装vs运行

锺离飞飙
2023-03-14

我有一个Spring Boot2.2项目。我使用的是MapStruct 1.3.1和Lombook 1.18.12。

我有这些模型:

@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);
    }
}
@Data
@Builder
public class Cdr3CXDto {

    String from;

    String to;

    String type;

    String startDate;

    String endDate;

    Long contactId;
}
@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);
}
<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>
<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>
@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;
    }
}

没有编译错误,没事。当我确实像映像中那样运行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();
    }
}

MapStruct似乎使用父类的构建器,而不是本问题中描述的子类。我希望有一种方法可以指导mapstruct生成正确的代码,即使当我在我的IntelliJ IDE中运行单个测试时也是如此。

共有1个答案

马臻
2023-03-14

从Maven执行编译和从IntelliJ执行编译应该没有区别。如果存在差异,则可能意味着Lombok@superbuilder存在一些问题。

我将尝试添加printProcessorInfoprintRunds编译器参数,以便您可以看到正在发生的事情。

 类似资料:
  • 关于Maven的小问题,以及安装和站点之间的区别。 当运行一个非常基本的干净安装时,我可以看到单元测试运行良好,完全没有问题。 然后,我得到了为项目生成一个网站的要求,以放置测试报告、javadoc等... 因此,我只是在maven生命周期中更进一步,使用mvn clean site而不是mvn Clear install。 然而,令人惊讶的是,mvn干净的网站似乎没有运行测试用例。(与 mvn

  • 我是Maven的新手,我有一个基于Java的web项目,在我的MyEclipse中配置了Maven。 现在,如果我修改了任何Java文件,那么我需要执行还是?

  • 和之间到底有什么区别?当我运行这两个命令时,它们似乎都在做同样的事情。

  • 我创建了一个gradle项目,并在Maven中创建了一个不同的项目。 maven项目中的jar是gradle项目的依赖项。 是否可以为maven项目运行mvn安装并将jar添加到gradle项目? 谢谢

  • 我下载了Maven并将其解压到文件夹中,然后将这些行添加到/etc/environment中。 export m2_home=/usr/local/apache-maven/apache-maven-3.0.4 导出M2=$M2_HOME/bin 解决了。抱歉,如果忘记回复这个。我在~/.bashrc中添加了导出行,然后它就开始工作了。

  • 问:如何运行一个安装文件 .reg 答:注:your.reg为文件名 ExecWait "regedit.exe /s your.reg" 问:如何运行一个安装文件 .inf 答:注:skins.inf 为文件名 ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall" 问:如何运行一个安装文件 .msi 答