0

我正在编写 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而不是YtoDto方法中。关键是,我不太喜欢它,我想找到更好的解决方案。

可能没有必要,但这里是实现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();
    }
}
4

1 回答 1

0

你的方法签名

public <T, Y> Y toDto(T domainObject)

导致问题,因为在您的调用上下文中

return new ResponseEntity<>(mapper.toDto(obj), HttpStatus.OK)

被解释为好像它能够返回 aMultiValueMap<String, String>以符合构造函数

public ResponseEntity(MultiValueMap<String, String> headers, HttpStatus status)

请参阅 javadoc:ResponseEntity(MultiValueMap<String, String>, HttpStatus)

通过修改您的toDto方法以明确表明它绝对不会返回 aMultiValueMap您可以解决此问题。例如,只需指定:

public Object toDto(Object domainObject)

因为转换方法可能会做到这一点。或者你可以限制你的泛型参数,以明确它不能根据当前调用的类型推断上下文返回任意类型的实例。

于 2019-07-17T20:17:40.373 回答