gpt4 book ai didi

java - 将 Web 应用程序从 Spring 3.2.2 升级到 Spring 5.1.5(上下文初始化失败 - BeanCreationException)

转载 作者:行者123 更新时间:2023-11-30 05:28:59 25 4
gpt4 key购买 nike

我正在升级一个在 Java6 + Spring 3.2.2 + Jersey 1.19 + Tomcat6 上正常工作的旧 Web 应用程序,以便使用每个组件的更新版本(Java8 + Spring 5.1.5 + Jersey 2.28 + Tomcat9),但是当我尝试启动它时出现问题。应用程序在 Tomcat 启动期间失败,特别是在 Spring ApplicationContext 初始化期间,我收到以下消息:

INFO: Initializing Spring root WebApplicationContext
org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
org.springframework.context.support.AbstractApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myBean': Invocation of init method failed; nested exception is java.lang.NullPointerException
org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myBean': Invocation of init method failed; nested exception is java.lang.NullPointerException
....
Caused by:
at my.package.utils.AppAssets.getContext()

出现错误的代码部分如下:

public static ApplicationContext getContext() {
if (ctx == null) {
ctx = ApplicationContextProvider.getApplicationContext();
}
return ctx;
}

特别是,ApplicationContextProvider 是一个在应用程序内获取 ApplicationContext 的有用类,如下所示:

package my.package.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextProvider implements ApplicationContextAware {

private static ApplicationContext ctx = null;

public static ApplicationContext getApplicationContext() {
return ctx;
}

public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}
}

applicationContext.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


<bean id="applicationContextProvider" class="my.package.utils.ApplicationContextProvider">
</bean>

<bean id="Resources" class="my.package.resources.Resources">
<property name="iniFile" value="/WEB-INF/properties/config.properties">
</property>
</bean>

</beans>

我的web.xml配置是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MYWEBAPP</display-name>

<!-- PATH SERVER - CONFIGURATION -->
<context-param>
<param-name>realPathName</param-name>
<param-value>rootPath</param-value>
</context-param>

<!-- LOG4J - CONFIGURATION -->
<context-param>
<param-name>log4j-config-location</param-name>
<param-value>WEB-INF/properties/log4j.properties</param-value>
</context-param>

<!-- LISTENER CONTEXT CONFIGURATION -->
<listener>
<listener-class>my.package.context.ContextListener</listener-class>
</listener>

<!-- SPRING - CONFIGURATION -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- JERSEY - CONFIGURATION - FILTER FOR SPRING AND JSPs -->
<filter>
<filter-name>jersey</filter-name>
<filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>my.package.rest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.mvc.templateBasePath.jsp</param-name>
<param-value>/WEB-INF/pages</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.server.mvc.jsp.JspMvcFeature</param-value>
</init-param>
<init-param>
<param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
<param-value>/(images|js|styles|resources|(WEB-INF/pages))/.*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jersey</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

如果它有用,我还附上以前的 web.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID"
version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>MYWEBAPP</display-name>


<!-- PATH SERVER - CONFIGURATION -->
<context-param>
<param-name>realPathName</param-name>
<param-value>rootPath</param-value>
</context-param>

<!-- LOG4J - CONFIGURATION -->
<context-param>
<param-name>log4j-config-location</param-name>
<param-value>WEB-INF/properties/log4j.properties</param-value>
</context-param>

<!-- LISTENER CONTEXT CONFIGURATION -->
<listener>
<listener-class>my.package.context.ContextListener</listener-class>
</listener>

<!-- RESTFUL WEB APPLICATION -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- JERSEY - FILTER FOR SPRING AND JSPs -->
<filter>
<filter-name>jersey</filter-name>
<filter-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</filter-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>my.package.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
<param-value>/WEB-INF/pages</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
<param-value>/(images|js|styles|resources|(WEB-INF/pages))/.*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jersey</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

最后,Spring 似乎未能初始化 ApplicationContext,因为 util 类的 getter 返回 null 但我不明白为什么:使用旧版本,上下文已成功初始化,感谢ApplicationContextAware 功能。我怀疑 Spring 和 Jersey 之间的交互配置错误,导致 ApplicationContextAware 无法正常工作。我做错了什么?

感谢您的帮助

最佳答案

您是否尝试过将 spring-beans-2.5.xsd 制作为 spring-beans.xsd。
因为建议使用无版本。

关于java - 将 Web 应用程序从 Spring 3.2.2 升级到 Spring 5.1.5(上下文初始化失败 - BeanCreationException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com