我有一个客户端代码,它调用web服务来获取某个日期范围内的月度价格,然后返回年平均价格:
@Service
@RequiredArgsConstructor
@Slf4j
public class PriceAverageService {
private final PriceServiceClient priceServiceClient ;
public BigDecimal getAverageAnnualPrice(Long productId, LocalDate startDate, LocalDate endDate) {
List<Price> prices = priceServiceClient.getMonthlyPrices(productId, startDate, endDate);
// code to compute average annual price
return averageMonthlyPrice;
}
}
@FeignClient(name="price-service")
@Validated
public interface PriceServiceClient {
@GetMapping("/product/price")
@Valid
@ConsecutivePrices
List<Price> getMonthlyPrices(
@RequestParam(name="productId")
Long productId,
@RequestParam(name="startDate")
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)
LocalDate startDate,
@RequestParam(name="endDate")
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)
LocalDate endDate);
}
Price
类:
@Value
public class Price {
BigDecimal price;
LocalDate priceDate;
}
如果一个月的价格缺失,而相邻月份没有缺失价格,则这是一个错误。例如,以下价格数据是一个错误:2020年1月15美元,2020年3月20美元。那是因为2020年2月不见了。CCD_ 2是检查该条件的CCD_ 3。
我还需要检查startDate
和endDate
是否有价格。如果缺少任何一个,则不是错误。如果缺少任何一个,代码应该为getAverageAnnualPrice
返回null(而不是计算年平均价格(。
是否应使用ConstraintValidator
来检查startDate
和endDate
价格是否存在?如果是的话,我会在getAverageAnnualPrice
里面抓到MethodArgumentNotValidException
吗?
我不会使用ConstraintValidator来实现服务的一部分域逻辑。正如您所说,缺少开始/结束日期价格不是错误,而是您的服务应该妥善处理的预期情况。(一般来说,我会尽量避免在正常/愉快的情况下使用异常。这包括使用ConstraintValidators。(
相比之下,丢失的连续价格在您的域模型中没有意义(根据您的解释(,即调用的服务永远不应该返回此价格,除非发生了真正意外的事情(例如损坏的数据模型(。因此,在这种情况下,验证器(并抛出异常(可能是合适的。如果不满足该条件(即,如果有时会返回丢失的连续价格,例如因为产品暂时停止销售或类似情况(,那么即使在这种情况下,我也会重新考虑使用ConstraintValidator。
(免责声明:我不是Spring用户,作为Java用户,我从未在客户端接口中使用过约束验证器,所以我可能会错过一些东西。然而,我认为这些考虑因素相当普遍。(