【问题标题】:Vaadin20: Scan Java code from Pom dependencyVaadin20:从 Pom 依赖中扫描 Java 代码
【发布时间】:2021-08-26 08:34:38
【问题描述】:

我想将一个 Java 类放入使用 Vaadin @Endpoint 注释(来自 com.vaadin.flow.server.connect.Endpoint)的 Maven 工件中,以便在多个 Vaadin 项目中使用该类。

以下是此类的一个简单示例:

import com.vaadin.flow.server.connect.Endpoint;
import lombok.RequiredArgsConstructor;
import java.util.Optional;

@Endpoint
@RequiredArgsConstructor
public class SupportInfoEndpoint {

  public Optional<String> getSupportInfo(){
    return Optional.of("mailto:support@my.corp");
  }
}

Maven 工件包括类的源代码。我该怎么做才能在使用项目中通过 Vaadin 构建过程扫描此类,以便

  • 生成前端对应的 TypeScript 代码
  • 该类包含在 Spring-Boot 应用程序中(因此端点实际上在运行时可用)

有可能吗?

【问题讨论】:

  • 我不确定这是否也适用于 Fusion。试试@EnableVaadin({"你的包名"})
  • @SimonMartinelli 这个注释应该放在哪里?到使用Application.java?
  • 在任何配置调用上。最好是你有@SpringBootApplication
  • @SimonMartinelli 它似乎不适用于我正在使用的 Vaadin 版本。注释仍然可用,但使用它会导致 BeanDefinitionOverrideException,使用 spring.main.allow-bean-definition-overriding=true 设置甚至无法将其静音。
  • 这意味着 SupportInfoEndpoint 已经注册了。

标签: vaadin vaadin20 vaadin-fusion hilla


【解决方案1】:

就像 Erik 说的,它将使用#9010 实现。

但是有一个解决方法取决于一些限制。如果端点需要的每个类都在同一个 jar 中,则可以通过调用 vaadin-maven-plugin 的目标“build-frontend”在同一个 jar 中触发打字稿生成,然后生成打字稿,这只是一些问题maven 魔法将它们移动到META-INF/resources/frontend(类似于here 所做的事情)。然后你就可以将端点打包到jar中了。

为了在项目中注册端点,你需要做一些类似于this class正在做的事情,基本上是一个ServiceInitListener,它将通过使用反射来执行EndpointRegistry的方法registerEndpoint

【讨论】:

  • 谢谢,Martín,这听起来很有趣,我会研究一下。
  • 太好了,vaadin:build-frontend 任务运行良好(同时还做了很多其他事情)。我们目前将生成的打字稿与使用它的前端代码打包在一起(因此很容易找到),但我会密切关注将它与后端 jar 打包在一起。 - 对于纯 Java 端点,似乎不需要注册,我们的端点可以从它的 jar 中找到并很好地使用。当我们可以将生成的打字稿添加到 jar 中时,我将研究 ServiceInitListener 方法。
  • 将 ts 打包在后端 jar 中的好处是,前面的 typescript 生成应该花费更少的时间,因为您将跳过重新生成未更改的内容(即:类在罐子里)。您仍然可以通过从 @vaadin/flow-frontend/generated 导入 ts 来使用代码完成,就像插件正在执行 here 一样。
  • @vaadin/flow-frontend/generated 指向什么?后端 jar 中的 resources/frontend 路径?在我的 Vaadin 19/20 应用程序的 package.json 中,@vaadin/flow-frontend 指向 ./target/flow-frontend,并且其中任何一个都不包含 generated 文件夹(但 frontend 中的源代码树有)?!
  • registerEndpoint 方法不在MenuEndpoint 上,而是在EndpointRegistry 上。调用该方法来动态注册端点。我用示例项目写了an article,你可以看到插件使用这种机制。
【解决方案2】:

不幸的是,目前还不可能,但一旦#9010 实施就可以了。

据我了解,它是 Fusion 团队实施的最高优先级功能之一。

【讨论】:

  • 谢谢。所以我认为也没有解决方法可以达到预期的效果?!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2015-10-12
  • 2021-01-29
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多