【发布时间】: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 中 <env-entry> 的运行时对象的位置,我在 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