У меня есть проект Spring Boot 2.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);
}
}
Я создал этот DTO:
@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);
}
Это моя релевантная часть 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>
Я также добавил зависимости:
<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>
Когда я запускаю 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;
}
}
Нет ошибок компиляции, это нормально. Когда я запускаю JunitTest, как на изображении, у меня возникает ошибка компиляции, потому что на этот раз реализация неверна:
![enter image description here](https://i.stack.imgur.com/IKFrp.png)
@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.