【问题标题】:How To Set Servlet Init Parameter in Apache Sling?如何在 Apache Sling 中设置 Servlet 初始化参数?
【发布时间】:2021-08-31 10:29:06
【问题描述】:

我有一个在其他项目中使用的共享 Java OSGi 包。这个我的共享库需要一些配置,其他项目必须通过 servlet 上下文初始化参数来配置它。

目前我的 JSP/Servlet、Spring/SpringBoot、Struts 用户可以在 web.xml 或 @SpringBootApplication 中设置所需的配置,如下所示:

JSP/Servlet、Spring、Struts 应用:

// web.xml
<init-param>  
  <param-name>my_config</param-name>  
  <param-value>value</param-value>  
</init-param>  

SpringBoot 应用:

@SpringBootApplication
public class SpringBootWebApplication extends SpringBootServletInitializer {
    
    @Bean 
    public ServletContextInitializer initializer() { 
      return new ServletContextInitializer() { 

        @Override 
        public void onStartup(ServletContext servletContext) throws ServletException { 
            servletContext.setInitParameter("my_config", "value"); 
        } 
      }; 
    }
}

现在,我正在尝试使我的共享库在 Apache Sling 上工作,但我不知道如何在 Apache Sling 中设置 servlet init 参数。我只是 Apache Sling 的新手。

【问题讨论】:

  • 你能告诉我们一点,你想达到什么?也许 SlingServlet 不是正确的答案。由于 Sling 构建在 OSGi (Apache Felix) 之上,因此您还可以通过 OSGi 白板模式集成一个 Servlet。甚至可以与底层的 Servlet Container (Jetty) 集成。但当然你也可以做一个 SlingServlet,然后配置将基于 OSGi。
  • PS:当您使用 SpringBoot 示例时,我假设您可能对互操作性更感兴趣,而不是 SlingServlet 的细节。实际上 Sling 本身主要是一个大的 servlet,它根据内容和配置进行大量的 URL 路由。那么您的 SlingServlet 只是 Sling 可以用来满足请求的众多端点之一。 SlingServlet 是一个 OSGi 组件,由 Sling 使用 - 它不直接连接到 Servlet-Container。它还具有某种兼容/相似但不同的 API。

标签: java aem sling


【解决方案1】:

实现此目的的一种方法是将 Sling 作为 WAR 在 servlet 容器中运行,并像往常一样在 web.xml 中提供 init-param - 请参阅 Sling configuration documentation

让诸如 Spring Boot 应用程序之类的东西与 Sling 一起工作将是太多的工作,因为他们倾向于使用自己的 servlet 容器、类加载器等。

【讨论】:

    【解决方案2】:

    在运行 Sling 独立应用程序时,加载 sling(并在 sling 之前处理所有 http)的 osgi HttpService 提供了一种动态注册 servlet 的方法:

     httpService.registerServlet("/myservlet", servlet, initparams, context);
    

    你可以在initparams中放一个键值对,Http Service会在返回之前调用servlet的init方法。

    您可能希望在此处注册容器的 DispatcherServlet(或等效项)并将进一步的 url 解析委托给它。 see documentation.

    请注意,这将绕过 sling 的 handleSecurity 方法(以及所有 sling 的安全检查),但此处调用的代码可以访问 jcr 以及 osgi 容器中的几乎所有内容。除非您有非常令人信服的理由,否则不要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多