<mapstruct.version>1.5.0.Beta2</mapstruct.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
...
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
...
@Mapper(implementationName = "RouteMapperImpl")
interface RouteMapper {
RouteDto toDto(Route Route);
Route toModel(RouteDto RouteDto);
}
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
interface ProductMapper {
ProductDto toDto(Product product);
Product toModel(ProductDto productDto);
ProductListItemDto toListItemDto(Product product);
}
@Mapper(componentModel = "spring", imports = Money.class)
public interface RestPaymentMapper {
@Mapping(target = "id", source = "requestId")
@Mapping(target = "value", expression = "java(Money.of(paymentRequestDto.getValue()))")
PaymentRequest toPorts(PaymentRequestDto paymentRequestDto);
@Mapping(target = "value", expression = "java(payment.value().toString())")
PaymentDto toDto(Payment payment);
@IterableMapping(elementTargetType = PaymentDto.class)
List<PaymentDto> toDto(List<Payment> payments);
ResultPageDto<PaymentDto> toDto(ResultPage<Payment> resultPage);
}
public interface TimeMachine {
SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Instant instant();
String utcDateAsString();
ZonedDateTime utcZonedDateTime();
}
----------
@Service
class TimeMachineReal implements TimeMachine {
@Override
public Instant instant() {
return Instant.now();
}
@Override
public String utcDateAsString() {
return FORMATTER.format(new Date());
}
@Override
public ZonedDateTime utcZonedDateTime() {
return ZonedDateTime.now();
}
}
----------
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class TestTimeMachine implements TimeMachine {
public static final Clock TEST_CLOCK = Clock.fixed(Instant.parse("2022-01-01T11:22:00.000Z"), ZoneId.systemDefault());
Clock clock;
@Override
public Instant instant() {
return Instant.now(clock);
}
@Override
public String utcDateAsString() {
return FORMATTER.format(new Date(clock.millis()));
}
@Override
public ZonedDateTime utcZonedDateTime() {
return ZonedDateTime.now(clock);
}
private TestTimeMachine(Clock clock) {
this.clock = clock;
}
public static TimeMachine init(String dateTime) {
return TestTimeMachine.init(Instant.parse(dateTime));
}
public static TimeMachine init(Clock clock) {
return new TestTimeMachine(clock);
}
public static TimeMachine init() {
return new TestTimeMachine(TEST_CLOCK);
}
public static TimeMachine init(Instant instant) {
return new TestTimeMachine(Clock.fixed(instant, ZoneId.systemDefault()));
}
}