我正在尝试遵循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);
}
请注意,我的问题还与我为truckById
和truckByTruckCode
提交的不同课程有关。
我已经'通过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。这有可能吗?
答案 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);
}
}