如何从 Vaadin 14 应用程序中访问 `ServletContext`?

How to access `ServletContext` from within a Vaadin 14 app?

我问的问题与问题相同,,但针对 Vaadin 14。

在Vaadin 7中,Vaadin提供了简单方便的调用:

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();

Vaadin 14 中的 VaadinServlet 上不再存在该特定调用。

➥ 在 Vaadin API 的其他地方是否有等效项?

我的最终目标是使用键值 "attribute" 集合来保留对我的应用程序范围对象的引用。

更新: 之一解释了这两种方法实际上都存在于 Vaadin 14 中,但其中一种未记录。

我确认我们确实可以调用:

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();

所以我在这里的其余答案已经过时了。我会留下我的答案作为好奇,而不是删除它。


这可能不是最好的方法,但它似乎对我有用。

你想要的 VaadinServletService class, extending com.vaadin.flow.server.VaadinService, offers the getCurrentServletRequest(). That method returns a javax.servlet.http.HttpServletRequest object. For there we can call javax.servlet.ServletRequest.getServletContext to return the javax.servlet.ServletContext

ServletContext servletContext = 
        VaadinServletService            // com.vaadin.flow.server.VaadinServletService
        .getCurrentServletRequest()     // Returns a javax.servlet.http.HttpServletRequest
        .getServletContext()            // Returns a `javax.servlet.ServletContext`. 
;

从那里您可以使用您提到的键值 "attribute" 集合。查看 setAttributegetAttributeremoveAttribute 方法,其中 String 对象作为键,Object 作为值。

节省。

DataSource dataSource = … ; 
VaadinServletService.getCurrentServletRequest().getServletContext().setAttribute( "javax.sql.DataSource" , dataSource ) ;

正在检索。 "attributes" 的键值集合将值保持为 Object,因此我们必须转换回预期的 class/interface.

DataSource dataSource = (DataSource) VaadinServletService.getCurrentServletRequest().getServletContext().getAttribute( "javax.sql.DataSource" ) ;

方法仍然存在,但未记录

两种方法:

…Vaadin 14 中还有吗。

似乎第二种方法 VaadinServlet::getServletContext() 没有在 Javadocs 中列出,因为它继承自 javax.servlet.GenericServlet 并且 Javadoc 生成 运行 的方式不可以访问 class.

VaadinContext

对于从 ServletContext 访问属性的特殊情况,Vaadin 14 中引入了一个新的 VaadinContext 抽象。添加它是为了使框架内部可以访问上下文属性而无需绑定Servlet API。可以使用 VaadinService.getCurrent().getContext().

访问它

VaadinContext 可以通过 class:

来追踪属性