我有以下组件,当我收到 Spring 事件时,我的网格没有刷新。这是为什么?
@Component
@Scope(SCOPE_PROTOTYPE)
public class SearchResultGridView extends Grid<SearchResultModel> implements
ApplicationListener<FetchBySubscriptionNumberAction> {
private static final Logger log = LoggerFactory.getLogger(SearchView.class);
private final SumoCmMemberService sumoCmMemberService;
private List<SearchResultModel> searchResultModels = new ArrayList<>();
private final List<String> columnNames = List.of(
"subscriptionNumber",
"mnr",
"firstName",
"lastName",
"dateOfBirth",
"street",
"houseNumber",
"box",
"postalCode",
"locality",
"active"
);
public SearchResultGridView(SumoCmMemberService sumoCmMemberService) {
super(SearchResultModel.class, false);
this.sumoCmMemberService = sumoCmMemberService;
initGridColumns();
initStyle();
}
private void initGridColumns() {
columnNames.forEach(columnName -> addColumn(columnName).setAutoWidth(true));
}
private void initStyle() {
addThemeVariants(GridVariant.LUMO_NO_BORDER);
setHeightFull();
}
@Override
public void onApplicationEvent(FetchBySubscriptionNumberAction action) {
log.info(action.getSubscriptionNumber());
sumoCmMemberService
.fetchBySubscriptionNumber(action.getSubscriptionNumber())
.doOnError(e -> log.error("error in webflux: " + e.getMessage()))
.subscribe(sumoCmMemberDto -> {
SumoSubscriptionDto sumoSubscriptionDto = sumoCmMemberDto.getSumoSubscription();
SearchResultModel searchResultModel = SearchResultModel
.builder()
.mnr(sumoCmMemberDto.getMnumber())
.firstName(sumoSubscriptionDto.getFirstName())
.lastName(sumoSubscriptionDto.getLastName())
.street(sumoSubscriptionDto.getStreet())
.houseNumber(sumoSubscriptionDto.getHouseNumber())
.box(sumoSubscriptionDto.getBox())
.active(sumoCmMemberDto.isActive())
.build();
searchResultModels = List.of(searchResultModel);
setItems(searchResultModels);
});
}
}
我正在使用我订阅的服务中的 Mono,我只想替换这些项目。
注意:我不喜欢 DataProvider api,并且我不想使用它。
我的用例很简单;我想订阅 Mono react 流并刷新表。
那么为什么这不起作用呢?网格布局 API 最简单的用例让人相信它应该如此。没有编译器错误,也没有运行时错误。只是什么也没发生,并且网格不显示我提供给它的数据。在 Debug模式下,我看到列表已正确填充。
但是网格没有显示任何内容。
最佳答案
问题是没有正在进行的客户端请求,因此 Vaadin 无法让浏览器知道某些内容发生了变化。
您需要做的是配置@Push
以启用双向通信,然后使用ui.access()
来处理更新:
UI ui = UI.getCurrent();
[...]
.subscribe(sumoCmMemberDto -> {
SumoSubscriptionDto sumoSubscriptionDto = sumoCmMemberDto.getSumoSubscription();
SearchResultModel searchResultModel = SearchResultModel
.builder()
.mnr(sumoCmMemberDto.getMnumber())
.firstName(sumoSubscriptionDto.getFirstName())
.lastName(sumoSubscriptionDto.getLastName())
.street(sumoSubscriptionDto.getStreet())
.houseNumber(sumoSubscriptionDto.getHouseNumber())
.box(sumoSubscriptionDto.getBox())
.active(sumoCmMemberDto.isActive())
.build();
searchResultModels = List.of(searchResultModel);
ui.access(()->setItems(searchResultModels)); // wrap setItems in ui.access()
});
在文档中了解更多信息:https://vaadin.com/docs/latest/flow/advanced/server-push/#push.access (V14 与最新版本之间存在细微差别,因此请确保阅读正确版本的文档)
关于java - Vaadin 网格不会在事件中刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69095509/