Объединение спецификации и предотвращение исключений NullPointerException и IllegalArgumentException - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь объединить 8 одинаковых критериев для простого запроса.

Я написал метод, подобный приведенному выше

private Specification<CustomerHeaderParameter> buildCustomerHeaderParameterSpecifications(String status, String customerType, Integer segment, String module, String cardType, String processType, String rewardType, Integer intervalMin, Integer intervalMax) {

    Specification<CustomerHeaderParameter> result = Specification.where(withStatus(StatusCode.getEnum(status)));
    if (!StringUtils.isEmpty(customerType)) result.and(withCustomerType(CustomerType.getEnum(cardType)));
    if (segment != null) result.and(withSegment(SegmentParameterNumber.valueOf(segment)));
    if (!StringUtils.isEmpty(module)) result.and(withModule(ModuleType.valueOf(module)));
    if (!StringUtils.isEmpty(cardType)) result.and(withCardType(CardType.getEnum(cardType)));
    if (!StringUtils.isEmpty(processType)) result.and(withProcessType(ProcessType.valueOf(processType)));
    if (!StringUtils.isEmpty(rewardType)) result.and(withRewardType(RewardType.valueOf(rewardType)));
    if (intervalMin != null && intervalMax != null) result.and(inInterval(intervalMin, intervalMax));

    return result;
}

Но здесь первая строка может вызвать NullPointerException или IllegalArgumentException, если status имеет значение null или отличаются от значений enum, потому что все мои классы Enum похожи на

public enum StatusCode {
    ACTIVE("A"), PASSIVE("P");

    private String value;

    StatusCode(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public static StatusCode getEnum(String value) {
        return Arrays.stream(values()).filter(v -> v.getValue().equalsIgnoreCase(value)).findFirst().orElseThrow(IllegalArgumentException::new);
    }
}

, а мои методы stati c похожи на

static Specification<CustomerHeaderParameter> withStatus(StatusCode status) {
    return (param, cq, cb) -> cb.equal(param.get(STATUS_CODE), status);
}

Как можно предотвратить исключения, если параметры метода нулевые или отличаются от значений в моих перечислениях?

Или общий вопрос; Какова наилучшая практика объединения спецификаций?

1 Ответ

0 голосов
/ 21 февраля 2020

Я решил проблему по классу Custom Specification

public class CustomerHeaderParameterSpecification implements Specification<CustomerHeaderParameter> {

    private StatusCode status;
    private CustomerType customerType;
    private SegmentParmNumber segment;
    private ModuleType module;
    private CardType cardType;
    private ProcessType processType;
    private RewardType rewardType;
    private Integer min, max;


    public CustomerHeaderParameterSpecification(StatusCode status, CustomerType customerType, SegmentParmNumber segment, ModuleType module, CardType cardType, ProcessType processType, RewardType rewardType, Integer min, Integer max) {
          this.status = status;
          this.customerType = customerType;
          this.segment = segment;
          this.module = module;
          this.cardType = cardType;
          this.processType = processType;
          this.rewardType = rewardType;
          this.min = min;
          this.max = max;
    }

    @Override
    public Predicate toPredicate(Root<CustomerHeaderParameter> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

        List<Predicate> predicates = new ArrayList<>();
        if (this.status != null) predicates.add(criteriaBuilder.equal(root.get(STATUS_CODE), status));
        if (this.customerType != null) predicates.add(criteriaBuilder.equal(root.get(CUSTOMER_TYPE), customerType));
        if (this.segment != null) predicates.add(criteriaBuilder.equal(root.get(SEGMENT_PARM_NUMBER), segment));
        if (this.module != null) predicates.add(criteriaBuilder.equal(root.get(MODULE_TYPE), module));
        if (this.cardType != null) predicates.add(criteriaBuilder.equal(root.get(CARD_TYPE), cardType));
        if (this.processType != null) predicates.add(criteriaBuilder.equal(root.get(PROCESS_TYPE), processType));
        if (this.rewardType != null) predicates.add(criteriaBuilder.equal(root.get(REWARD_TYPE), rewardType));
        if (this.min != null && this.max != null) predicates.add(criteriaBuilder.between(root.get(PARAMETER_NUM), min, max));

        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
    }

}
...