Не знаю, как преобразовать значение в запрошенный тип - PullRequest
0 голосов
/ 04 мая 2020

Возникает ошибка преобразования при использовании API критериев с пользовательским типом. Ошибка выглядит следующим образом:

java .lang.IllegalArgumentException: не известно, как преобразовать значение [100.00: br.mrv.currency.MoneyImpl] в запрошенный тип [br.mrv.currency.Money ]

Я в замешательстве, потому что класс MoneyImpl является классом Money. Чтобы уточнить, это то, что я реализовал:

Абстрактный класс, используемый для обработки значений валюты:

public abstract class Money extends Number {

}

Реализация денег:

class MoneyImpl extends Money {
    // Number methods implementation

    @Override
    public int intValue() {
        // implementation
    }

    @Override
    public long longValue() {
        // implementation
    }

    @Override
    public float floatValue() {
        // implementation
    }

    @Override
    public double doubleValue() {
        // implementation
    }
}

Атрибут-собеседник, использовать класс Money в слое persistense:

@Converter
public class MoneyAttributeConverter implements AttributeConverter<Money, Double> {
    @Override
    public Double convertToDatabaseColumn(Money money) {
        if (Objects.isNull(money) || money.isNull())  {
            return null;
        }

        return money.toDouble();
    }

    @Override
    public Money convertToEntityAttribute(Double value) {
        if (Objects.isNull(value))  {
            return Money.NULL;
        }

        return Money.from(value);
    }
}

Сущность Employee со свойством заработной платы Money:

@Entity
public class Employee {
    @Convert(converter = MoneyAttributeConverter.class)
    private Money salary;
    // (...)
}

Наконец, спецификация выбирает сотрудников с зарплатой, превышающей некоторое значение :

public class SalaryGreaterThan extends Specification<Employee> {
    private Money value;

    public SalaryGreaterThan(Money value) {
        this.value = value;
    }

    @Override
    public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
        return  builder.gt(root.get("salary"), value);
    }
}

Я что-то упустил? Нужно ли использовать другой тип собеседника?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...