如何在不直接访问 ServletContext 的情况下在 JavaBean 中获取 java web 根路径

How to get java web root path in JavaBean without having direct access to ServletContext

我有一个部署在 Java Web 应用程序中的 JavaBean,该应用程序基于复杂的工作流框架,例如 CMN、BPMN 和 DMN。这里的要点是我的 JavaBean 是从 BPMN 调用的,在我看来它是在 rest API 端点的上下文中,因为我可以测试已部署的 JavaBean邮差。当我从 BPMN 调用 JavaBean 时,我没有看到任何对 ServletContext 或 JSP 或请求对象或类似内容的引用。

我需要修改 JavaBean 以添加一些需要从 Web 根路径下的数据文件夹加载 json 数据文件的功能。

我确实使用动态 Java Web 应用程序和 JavaBean 成功构建了一个示例 Web 应用程序,并且能够从请求对象访问 Web 根路径,并且能够加载json 数据文件符合预期。

我现在需要从真正的 Java Web 应用程序框架做同样的事情。我面临的唯一问题是如果我无法访问 HttpServlet 和其他相关对象,如何访问 Web 根路径。

我在示例 Web 应用程序中使用了下面的 APIs,它们成功运行:

Request.getsession (). Getservletcontext (). Getrealpath ();
Servletconfig.getservletcontext (). Getrealpath ("/");

请参阅下面的示例项目的相关回购以澄清问题:

https://github.com/tarekahf/JavaBeanExample2/tree/master

在上述 repo 中的项目中,我正在从 webroot 下的文件夹中加载一个 JSON 文件。我能够这样做是因为我可以访问 request 对象和 HttpServletContext。请参阅上述 repo 中以下文件中的源代码:

现在的问题是,如果我没有在主 java 应用程序的任何地方看到 ServletContext 的定义,如何访问它?

如果从休息 API 执行线程的上下文中调用 JavaBean,我如何访问此 JavaBean 中的 webroot 路径以便我可以加载根路径下需要JSON个数据文件?

塔雷克

如果 JavaBean 是 CDI 管理的,您可以将 ServletContext 注入:

@Inject
private ServletContext;

——

如果你只是想在 java 代码中读取一个 json 文件,我会说你可以看看这个:read ressource from folder


编辑:

既然发现应用程序是基于Spring,那么将servlet注入Bean的合适方法是使用@Autowired注解或实现ServletContextAware接口。有关详细信息,请参见: https://roytuts.com/how-to-get-servletcontext-and-servletconfig-object-in-a-spring-bean/

此外,这是关于如何读取 Java 中文件的另一个资源:

https://www.baeldung.com/reading-file-in-java