Версия 7 - установка значения с помощью field.unwrap.setValue()

В экранах наследниках AbstractEditor для некоторого специфичного случая использовал установку значений c помощью

field.unwrap(com.vaadin.ui.TextField.class).setValue()

В новых экранах наследниках StandartScreen обязательные поля, установленные таким образом, не считаются “установленными”.
image

1 симпатия

Здравствуйте,

К сожалению, мы не можем гарантировать, что то, что вы делаете напрямую с Vaadin компонентами, не поменяется и продолжит работать. Более того, поддержать поведение setValue в обход нашего API мы не сможем.

Расскажите о вашем специфичном случае, возможно есть более адекватное решение, чем вмешиваться в работу компонентов.

Юрий, доброго дня.

Вот здесь я описывал свою проблему:

Мне не до конца понятна та проблема и нет кода, где бы мы могли воспроизвести её, но кажется ваша исходная проблема должна исчезнуть в версии 7. Попробуйте, пожалуйста, начать с неё и не использовать этот обходной путь.

1 симпатия

С этим и была связана пауза в ответе. Дошли руки проверить не изменилось ли поведение в версии 7. Оно не изменилось.

Проблема на самом деле проста. При использовании кастомного datatype результат введенный с клавиатуры и результат установленный с помощью метода setValue() различаются. Велика вероятность, конечно, что я сам где-то косячу…

Я думаю, что смогу предоставить тестовый проект для демонстрации проблемы, но позднее. Сейчас это не первоочередная задача.

Юрий, прилагаю тестовый проект, иллюстрируюший проблему.
dataType.zip (82,4 КБ)
Необходимо:

  1. Application -> Foos -> Create
  2. Нажать кнопку Value=10
    Результат: в поле установлено значение 5, в БД будет сохранено 10.
    Ожидаемое поведение: в поле установлено значение 10, в БД сохранено 20.

Возможно, я чего-то не понимаю. Когда вы устанавливаете в сущность значение, то именно это значение будет сохранено в БД.

В вашем примере вы явно ставите в сущность 10, соответственно и сохраняется 10. Т.е. чтобы вам сохранить 20, то и ставить надо 20. При программной установке значения компонент не разбирает ваше значение заново, он просто использует готовое значение.

1 симпатия

Юрий, думаю, что это я чего-то не понимаю…
В моем представлении устанавливаемое значение должно пройти трансформацию через DataType прежде чем быть установленным в сущность. Не важно в форме мы его вводим или с помощью сеттера (сейчас написал “сеттер” и стало понятно, что я ошибался).

Что можете посоветовать при условии, что:

Общая задача описана тут (собственно первые два сообщения):

Т.е. вся логика преобразования у меня спрятана в DataType.

Во фреймворке это не так, все операции со значениями - операции с данными, не с представлением. А Datatype используется только для представления данных в UI. Т.е. когда вы устанавливаете значение через сущность или через UI component - это всегда работа без учёта того, как данные выглядят на экране.

В итоге, вашу задачу достаточно свести к

Datatype<Integer> doubleDatatype = Datatypes.getNN(Integer.class);
try {
    getEditedEntity().setIntegerField(doubleDatatype.parse("10"));
} catch (ParseException ignored) {
}
2 симпатии

Юрий, большое спасибо за разжевывание.

Юрий, в моем случае что-то с типами не получается…
image

Не подскажите что не так делаю?
DataType объявлен как в документации

@JavaClass(BigDecimal.class)
public class Length implements Datatype<BigDecimal>{

Методы parse возвращают BigDecimal.

В вашем примере тоже ошибка Datatype<Integer> doubleDatatype = Datatypes.getNN(Integer.class);
Должно быть, видимо Datatype<Double> doubleDatatype = Datatypes.getNN(Double.class);

Если ваш datatype не переопределяет системный, то получать его надо по-другому (по ID):

@Inject
protected DatatypeRegistry datatypeRegistry;

@Subscribe("setValueBtn")
private void onSetValueBtnClick(Button.ClickEvent event) {
    Datatype<Integer> doubleDatatype = datatypeRegistry.get("Double");
    try {
        getEditedEntity().setIntegerField(doubleDatatype.parse("10"));
    } catch (ParseException ignored) {
    }
}

В параметре типа пишется тип значения, а не класс datatype.

1 симпатия