Когда я добавляю компоненты в компонент Vaadin (например, TabSheet
или Tree
), добавленные компоненты кэшируются. Когда пользователь щелкает вкладку (или узлы дерева), если она содержит данные базы данных, она показывает устаревшие данные, не отражающие последнее состояние базы данных.
Интересно, есть ли способ обеспечить загрузку последних данных?
Я решаю проблему, определяя свой собственный интерфейс:
public interface Reloadable {
void reload();
}
И каждый компонент реализует этот перезагружаемый интерфейс, например:
@SpringComponent
public class TeachersView extends VerticalLayout implements Reloadable, Serializable {
@Inject
private TeacherDao teacherDao;
private final static int PAGESIZE = 10;
private MTable<Teacher> mTable = new MTable<>(Teacher.class);
@PostConstruct
public void init() {
// mTable settings skip here
reload();
addComponent(mTable);
}
@Override
public void reload() {
mTable.setBeans(new SortableLazyList<>(
sortablePagingProvider ,
() -> (int) teacherDao.count() ,
PAGESIZE
));
}
private SortableLazyList.SortablePagingProvider<Teacher> sortablePagingProvider =
(firstRow, asc, sortProperty) -> {
return teacherDao.findAll(
new PageRequest(
firstRow / PAGESIZE, PAGESIZE,
asc ? Sort.Direction.ASC : Sort.Direction.DESC,
sortProperty == null ? "id" : sortProperty
)
).getContent();
};
}
И это представление внедряется в класс UI
:
@SpringUI(path = "/ui")
@Theme("valo")
public class VaadinUI extends UI {
@Inject
private TeacherDao teacherDao;
@Inject
private TeachersView teachersView;
@Override
protected void init(VaadinRequest vaadinRequest) {
Panel panel = new Panel("Admin Panel");
HorizontalSplitPanel splitPanel = new HorizontalSplitPanel();
splitPanel.setSplitPosition(15, Unit.PERCENTAGE);
panel.setContent(splitPanel);
Tree tree = new Tree("Menu");
splitPanel.setFirstComponent(tree);
Label home = new Label("Home");
Map<String, Component> map = new HashMap<>();
map.put("Teachers", teachersView);
map.put("Home", home);
map.forEach((k, v) -> tree.addItem(k));
tree.addItemClickListener(event -> {
Component view = map.get(event.getItemId());
if (view instanceof Reloadable) {
((Reloadable) view).reload();
}
splitPanel.setSecondComponent(view);
});
splitPanel.setSecondComponent(home);
setContent(panel);
} // init()
}
Обратите внимание на tree.addItemClickListener
, я должен проверить каждый компонент, если он реализует Reloadable
, если true , вызвать его.
Оно работает . Но я не знаю, является ли это стандартным способом достижения этого? Я думаю, что это должен быть общий сценарий, должно быть что-то вроде встроенного интерфейса для реализации компонентов, например, onRender
(но я не могу его найти). Я ничего не пропустил?
Спасибо.