如何在一个控制器中返回两个返回类型,返回类A的集合或类B的对象

时间:2018-04-21 16:33:01

标签: spring rest url uri

我正在尝试遵循Rest Principles,所以我有两个休息控制器 使用基本网址localhost:8088/trucks

首先,我必须得到所有卡车:

@GetMapping(value = "/trucks")
public final Collection<TruckDto> getAllTrucks() {
    LOGGER.debug("test: getAllTrucks()");
    Collection<Truck> trucks = truckService.getAllTrucks();
    return mappingService.map(trucks, TruckDto.class);
}

请注意,我的问题还与我为truckByIdtruckByTruckCode提交的不同课程有关。

我已经'通过ID获得卡车'服务:

@GetMapping(value = "/trucks/{truckId:[0-9]+}")
@ResponseStatus(HttpStatus.FOUND)
@ResponseBody
public final TruckDto getTruckId(@PathVariable(value = "truckId") final Integer truckId) {
    LOGGER.debug("test: truckId({})", truckId);
    Truck truck = truckService.getTruckById(truckId);
    return mappingService.map(truck, TruckDto.class);
}

现在我有一个getCartCode工作,但它没有遵循其余的原则,这就是,应该只有一个基本网址,所有其他人都是从它构建的,这里是

  @ResponseStatus(HttpStatus.OK)
  @ResponseBody
  @GetMapping(value = "/trucks/{truckCode:[0-9]*[a-zA-Z][a-zA-Z0-9]*}")
  public final TruckWithAvgPetrolDto getTruckByTruckCode (@PathVariable(value = "truckCode")
            final String truckCode) {
      LOGGER.debug("getTruckByTruckCode()");

      TruckWithAvgDto truck = truckService.getTruckByTruckCode(truckCode);
      return  mappingService.map(truck, TruckWithAvgPetrolDto.class);
  }

现在它可以工作,但我认为它应该是一个可选的参数,因为它应该在一个方法中。所以也许我可以有一些可选的返回类型,因为我有两种不同的服务,在两种情况下返回的方法。

因为get by id只获取卡车详细信息,但get by trukCode执行左连接并从订单表中获得卡车平均消耗的汽油,因此我有两个不同的DTO用于get by id和{{ 1}}。

我的问题是,如果我输入一个应该通过id得到的数字然后返回get by truckCode,我怎么能得到像getBY(param)这样的方法呢?但是如果我输入像BY788这样的代码它应该通过代码得到并返回一个TruckWithAvgPetrolDto。这有可能吗?

1 个答案:

答案 0 :(得分:1)

这是一个有效的解决方案,但我需要验证可以在休息时这样做,或者这是不好的做法

  @GetMapping("/trucks/{value}")
    public ResponseEntity<?> getTruckByIdOrCode(@PathVariable(value = "value" )String value) {

        if (value.matches("[0-9]*[a-zA-Z][a-zA-Z0-9]*")) {
            TruckWithAvgDto list = truckService.getTruckByTruckCode(value);
            return new ResponseEntity<TruckWithAvgDto>(list, HttpStatus.FOUND);
        }else {
            Truck truck = truckService.getTruckById(Integer.parseInt(value));
            return new ResponseEntity<Truck>(truck,HttpStatus.FOUND);
        }

    }