我有一个 swarm 服务容器,暴露了 5500 端口。在容器中,https://localhost:5500/app上有一个 Web UI 。我的服务称为 service1。
我正在使用 traefik 2 代理,并且我希望我的 service1 的 Web UI 在https://proxy.domain.com/service1/app上可用。
我的 service1 traefik 标签配置如下:
labels:
- "traefik.http.routers.service1.rule=Host(`proxy.domain.com`) && PathPrefix(`/service1/app`)"
- "traefik.http.middlewares.strip-s1.stripprefix.prefixes=/service1"
- "traefik.http.routers.service1.service=service1@docker"
- "traefik.http.services.service1.loadbalancer.server.port=5500"
- "traefik.http.routers.service1.middlewares=strip-s1@docker"
- "traefik.http.routers.service1.entrypoints=https"
- "traefik.http.routers.service1.tls=true"
Run Code Online (Sandbox Code Playgroud)
据我了解 traefik,通过此配置,我可以调用与路由器规则匹配的https://proxy.domain.com/service1/app。Traefik 然后将从 pathPrefix 中去除 /service1,因此 /app 将保留并转发到端口 5500 上的服务容器,因此我认为该容器将在端口 5500/app 上被调用。
但是当我在浏览器中调用https://proxy.domain.com/service1/app时,我得到 HTTP_502 Bad gateway。
当我这样做时curl -v https://proxy.domain.com/service1/app,我也会得到 HTTP_502。
当我这样做时curl -v https://proxy.domain.com:5500/app,它工作并且我连接到端口 5500/app 并被重定向到容器中的端口 5500/app/login(此重定向由 /app 后面的 Web …
我开始用vaadin和spring boot构建一个Web应用程序。我想创建一个vaadin站点,该站点在网格中列出来自MSSQL Server的数据。尝试使用@Autowired CrudRepository时,我总是会收到NullPointerException。
我已经阅读了很多vaadin和Spring教程,在Stackoverflow中搜索了类似的问题,但仍未找到解决方案。在大多数情况下,如果发生相同的错误,人们会忘记将存储库注释为@Repository或使用新的UI类来创建UI类……我检查了所有常见的错误,但我的代码无法正常工作。我还针对数据库编写了单元测试,效果很好!
我的带有@Repository批注的CrudRepository接口
...
@Repository
public interface BewohnerRepository extends CrudRepository<Bewohner, Integer>{
...
}
...
Run Code Online (Sandbox Code Playgroud)
我的UI应该使用@Autowired存储库显示数据
...
@Route("")
@SpringComponent
@Configurable
public class VaadinMainUI extends VerticalLayout {
@Autowired
private BewohnerRepository bewohnerRepository;
public VaadinMainUI() {
Grid<Bewohner> grid = new Grid<Bewohner>(Bewohner.class);
Iterable<Bewohner> bewohnerList = bewohnerRepository.findAll();
grid.setItems((Collection<Bewohner>) bewohnerList);
add(grid);
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序主班:
...
@SpringBootApplication
public class IndikatorenbogenApplication {
public static void main(String[] args) {
SpringApplication.run(IndikatorenbogenApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的JUnit测试也使用@Autowired存储库(此测试工作正常,并列出了来自我的数据库的数据:
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class BewohnerRepositoryTest {
@Autowired
private BewohnerRepository bewohnerRepository;
@Test
public …Run Code Online (Sandbox Code Playgroud) 我有一个 docker 映像,其中包含控制器 /opt/myfiles 中的数据,可以这么说: /opt/myfiles/file1.txt /opt/myfiles/file2.dat
我想将该映像部署到 kubernetes 并将 NFS 卷挂载到该目录,以便在删除 pod 时保留对这些文件的更改。
当我在 docker swarm 中执行此操作时,我只需将一个空的 NFS 卷安装到 /opt/myfiles/ ,然后启动我的 docker swarm 服务,该卷将填充映像中的文件,然后我可以使用我的服务,当我删除服务后,我的 NFS 服务器上仍然有文件,因此下次启动服务时,我会恢复之前的状态。
在 kubernetes 中,当我将空 NFS 卷挂载到 /opt/myfiles/ 时,pod 会启动,并且 /opt/myfiles/ 会被空目录覆盖,因此我的 pod 不再看到映像中的文件。
我的卷挂载和卷定义:
[...]
volumeMounts:
- name: myvol
mountPath: /opt/myfiles
[...]
volumes:
- name: myvol
nfs:
server: nfs-server.mydomain.org
path: /srv/shares/myfiles
Run Code Online (Sandbox Code Playgroud)
我读了一些关于类似问题的帖子(例如K8s 不会在 Persistent Volume 上挂载文件),并尝试了一些使用subPath和 的内容subPathExpr,如文档中所示(https://kubernetes.io/docs/concepts/storage/volumes/#using- subpath),但我的任何更改都没有执行 docker swarm 默认情况下执行的操作。
kubernetes 的行为对我来说似乎很奇怪,因为我已经使用 docker swarm 有一段时间了,并且我熟悉 …
我是 vaadin 的新手,我正在尝试使用 SQL Server 中的数据构建一个包含多个页面的 Web 应用程序。感谢我对几个 StackOverflow 主题的研究,我可以让第一页工作,在网格中显示我的 Person 实体的一些基本数据。
现在,当我在网格中选择一条记录并单击一个按钮时,我想打开第二页并使用所选人员的 ID ( person.getId()) 将其他数据从后端加载到 FormLayout(在本例中为联系信息)。
目前,我已经让我的应用程序打开了第二页,但没有数据。我的第二页有@Route("/contact")注释,我ui.navigate("/contact")在第一页中使用,以导航到第二页。
昨天我花了几个小时阅读 Blackboard EventBus 在页面之间传递数据。我做了一个简单的例子,第一页触发一个人事件,第二页监听这些事件并用System.out.println(). 但是如何使用此事件/人员数据刷新我的第二个 vaadin 页面?在 Blackboard 代码示例中,我的 Blackboard Bus 是静态的。
如前所述,我想选择一个人,然后导航到另一个页面以加载此人的其他信息。如果用户导航回第一页并选择另一个人,再次单击按钮导航到第二页,则第二页应刷新并显示新选择的人的数据。
目前,我的第二个页面加载,但崩溃了NullPointerException,因为 selectedPerson 变量为空,我不明白如何使用 Blackboard Listener 使用从事件中检索到的人员数据刷新 UI。
我现在真的不知道如何进行。
我有一个带弹簧靴的 vaadin flow (13) 应用程序。我有一个 VerticalLayout,@UIScope用多个子布局注释。子布局@Scope("prototype")通过ctx.getBean(SubUI.class, ...). 根据父 UI (VerticalLayout) 上的选择和按钮单击,添加或删除子布局。
只要我单独使用该应用程序,一切都可以正常工作(这就是我在将应用程序交付给我的客户进行验收测试后现在发现错误的原因)。他们对多个用户进行了测试。只要有一个用户使用该应用程序,一切都正常,但是一旦第二个用户进入 UI (VerticalLayout),就会抛出以下异常:
java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Cannot access state in VaadinSession or UI without locking the session.
at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:1.8.0_202]
at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[na:1.8.0_202]
...
Run Code Online (Sandbox Code Playgroud)
我为我的父布局尝试了不同的注释(@UIScope、@Scope("prototype")、@VaadinSessionScope)但没有解决我的错误。
我用谷歌搜索了这个问题并找到了一些线索,但没有一个能帮助我解决我的问题。我不确定问题是由我的 UI/布局的范围引起的,还是由数据绑定引起的。在我的子布局中,数据使用Binder<MyEntity> binder = new Binder<>(MyEntity.class);和绑定binder.forField(xxx).bind(MyEntity::getXY,MyEntity::setXY);。
有人可以解释我,我的问题是什么?我会很高兴,因为我需要为我的客户测试提供一个固定版本。
亲切的问候
java ×3
vaadin ×3
vaadin-flow ×3
docker ×2
docker-swarm ×2
spring-boot ×2
autowired ×1
kubernetes ×1
nfs ×1
spring ×1
sql-server ×1
traefik ×1
volume ×1