【问题标题】:Spring Boot take over web.xml configurationSpring Boot 接管 web.xml 配置
【发布时间】:2018-03-05 07:26:07
【问题描述】:

我有一个运行良好的 Spring Boot Web 应用程序。现在我得到了一个我必须在项目中使用的 3rd 方库。集成 lib 的手册是针对现有的 web.xml 文件编写的。我的项目完全依赖于基于 Java 的配置。

根据 Spring 文档,我可以在 WebApplicationInitializer 的帮助下实现将 web.xml 内容接管到我的应用程序中的目标。

这就是我所做的(至少我认为我做得正确)。 在进入更多细节之前,这里是 web.xml:

<servlet>
   <servlet-name>LoginServlet</servlet-name>
   <servlet-class>some.package.path.LoginServlet</servlet-class>
</servlet>
<servlet>
   <servlet-name>LogoutServlet</servlet-name>
   <servlet-class>some.package.path.LogoutServlet</servlet-class>
</servlet>
<servlet>
   <servlet-name>ResultServlet</servlet-name>
   <servlet-class>some.package.path.ResultServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>LoginServlet</servlet-name>
   <url-pattern>/saml/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>LogoutServlet</servlet-name>
   <url-pattern>/saml/logout</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>ResultServlet</servlet-name>
   <url-pattern>/saml/result</url-pattern>
</servlet-mapping>
<env-entry>
   <env-entry-name>some.package.path.config-file</env-entry-name>
   <env-entry-type>java.lang.String</env-entry-type>
   <env-entry-value>$HOME/.libName/libName-config.xml</env-entry-value>
</env-entry>

这是我在 Java 配置中重构的方式:

public class WebAppInitializer implements WebApplicationInitializer {

    private static final Logger LOG = Logger.getLogger(WebAppInitializer.class.getSimpleName());

    @Override
    public void onStartup(ServletContext servletContext) {
        final AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.scan("de.davidartmann.myapp.configuration");

        final ServletRegistration.Dynamic dispatcher =
            servletContext.addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");

        final ServletRegistration.Dynamic loginServlet =
            servletContext.addServlet("LoginServlet", LoginServlet.class);
        loginServlet.addMapping("/saml/login");

        final ServletRegistration.Dynamic logoutServlet =
            servletContext.addServlet("LogoutServlet", LogoutServlet.class);
        logoutServlet.addMapping("/saml/logout");

        final ServletRegistration.Dynamic resultServlet =
            servletContext.addServlet("ResultServlet", ResultServlet.class);
        resultServlet.addMapping("/saml/result");

        try {
            final InitialContext initialContext = new InitialContext();
            initialContext.addToEnvironment("some.package.path.config-file",
                "$HOME/.libName/libName-config.xml");
        } catch (NamingException e) {
            LOG.log(Level.SEVERE, "Could not initialize an InitialContext", e);
        }
    }
}

问题在于,第 3 方库使用此设置会引发内部 NPE。 NPE 被抛出在@Injects(基于 CDI)web.xml 中 &lt;env-entry&gt; 的运行时对象的位置,我在 WebAppInitializer 类中将其实现为 InitialContext

我的 Spring Boot 应用程序使用 SpringBootServletInitializer。关于Traditional Deployment 的Spring 文档中提到了它:

通常,现有 WebApplicationInitializer 中的所有代码都可以移动到 SpringBootServletInitializer 中

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(MyApplication.class);
    }
}

现在,我不确定该怎么办?我的WebApplicationInitializer 实现是否正确,还是我需要在我的 Spring Boot 主类中使用SpringBootServletInitializer

感谢您的帮助。 大卫

【问题讨论】:

    标签: java spring spring-boot web.xml spring-java-config


    【解决方案1】:

    问题是,用于部署应用程序的 Tomcat 服务器没有提供依赖注入 (CDI) 的实现。我不得不改用 Wildfly,它提供了必要的实现。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2013-10-03
      • 2016-03-09
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多