我正在编写 Spring 应用程序,我想将它分成几层以将域与框架完全分开。
因此,我的域方法正在返回 vavr Either<Error, T>
,而我的控制器正在为所有这些方法使用简单的解析器。
<T> ResponseEntity resolve(Either<Error, T> either) {
return either
.map(this::successResponse)
.getOrElseGet(this::failureResponse);
}
private ResponseEntity<Object> successResponse(Object obj) {
return new ResponseEntity<>(mapper.toDto(obj), HttpStatus.OK);
}
问题是,我不想从控制器返回我的域实体,所以我编写了通用映射器,它将使用单一方法将每个域对象转换为其 dto。
public <T, Y> Y toDto(T domainObject) {
if(domainObject instanceof Reservation) {
return (Y) reservationMapper.toDto((Reservation)domainObject);
}
return null;
}
Reservation
并且ReservationMapper
这里是一个域的具体实现,if
当然可以用更好的解决方案代替,但事实并非如此。
情况是,它不起作用。它抛出
java.lang.ClassCastException:类 com.johndoe.reservationsystem.adapter.dto.ReservationDto 不能转换为类 org.springframework.util.MultiValueMap
我找到了创建空抽象类的解决方法Dto
,让我所有的 dto 类扩展它,然后只返回Dto
而不是Y
在toDto
方法中。关键是,我不太喜欢它,我想找到更好的解决方案。
可能没有必要,但这里是实现ReservationMapper
class ReservationMapper {
ReservationDto toDto(Reservation reservation) {
return ReservationDto.builder()
.id(reservation.getId())
.ownerId(reservation.getOwnerId())
.reservedObjectId(reservation.getReservedObjectId())
.title(reservation.getTitle())
.description(reservation.getDescription())
.startDate(reservation.getStartDate())
.endDate(reservation.getEndDate())
.build();
}
}