java - Vaadin 网格不会在事件中刷新

标签 java spring spring-boot vaadin

我有以下组件,当我收到 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模式下,我看到列表已正确填充。

enter image description here

但是网格没有显示任何内容。

最佳答案

问题是没有正在进行的客户端请求,因此 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/

相关文章:

java - Spring Boot 多项目 Maven 应用程序上下文错误

spring-boot - Spring Boot 看不到 mustache 模板

spring-boot - 使用@RunWith(SpringJUnit4ClassRunner.class)运行文本案例时获取异常。如何解决这个问题?

java - 错误 - trustAnchors 参数必须非空

java - 在 Thymeleaf 中使用 DateFormat.SHORT

java - 如何以编程方式使用 Intellij IDEA 代码格式化程序?

java - 我对 @ModelAttribute 的理解正确吗?

java - 从 Java JNI DLL 写入 stdout - 输出仅在应用程序退出时出现

java - 无法反序列化],根本原因是 java.io.EOFException : null

java - 如何使用 Spring WebClient 禁用 cookie