Struts2整合Spring,Action配置报错,请问什么情况?

发布于 2021-11-25 15:12:42 字数 5748 浏览 830 评论 14

项目使用了SSH,用注解的方式装备bean,如果只在Dao,service层注解。没有问题可以正常启动tomcat,bean也装配成功,可以正常访问。如果action也加了注解就会启动失败,并且报错

启动tomcat时的异常:

[ERROR] 2016-02-25 17:21:24,427 [ pool-2-thread-1:1123 ] method:initWebApplicationContextContext initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'policeLoginAction' defined in file [E:Workspaceseclispe.metadata.pluginsorg.eclipse.wst.server.coretmp0wtpwebappszyhCity160129WEB-INFclassescomsafeactionpolicePoliceLoginAction.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.safe.action.police.PoliceLoginAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4765)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5260)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1525)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1515)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.safe.action.police.PoliceLoginAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
	... 22 more
Caused by: java.lang.NullPointerException
	at org.apache.struts2.ServletActionContext.getRequest(ServletActionContext.java:112)
	at com.safe.action.BaseAction.<init>(BaseAction.java:23)
	at com.safe.action.police.PoliceLoginAction.<init>(PoliceLoginAction.java:15)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
	... 24 more



action:
package com.safe.action.police;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.safe.action.BaseAction;
import com.safe.model.Police;
import com.safe.service.PoliceService;
import com.safe.util.ConstantUtil;

@Controller
public class PoliceLoginAction extends BaseAction {
	private static final long serialVersionUID = 1L;
	@Autowired
	private PoliceService policeService;

	private String policeNo;
	private String pwd;// 叫做授权码 只有在开发测试时使用 2016年1月20日15:34:02
	private String token;

	public String getPoliceNo() {
		return policeNo;
	}

	public void setPoliceNo(String policeNo) {
		this.policeNo = policeNo;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getToken() {
		return token;
	}

	public void setToken(String token) {
		this.token = token;
	}

	@Override
	public String execute() throws Exception {
		String returnStr = SUCCESS;
		System.out.println(
				new SimpleDateFormat("yyyy-MM-dd HH
              

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

一笔一画续写前缘 2021-12-02 05:58:40

找到一个解决办法给ACTION加注解@Lazy(true),但是感觉这个不是最好的办法。

南汐寒笙箫 2021-12-02 05:58:40

想不到还有人在使用struts。。。。。

混吃等死 2021-12-02 05:58:38

新的疑问:spring容器applicationContext默认创建Bean是单例作用域。Struts2的action是多例的,如果给action加上注解被Spring管理。会不会在作用域上又冲突?

多彩岁月 2021-12-02 05:58:38

第二种办法IOC注入: BaseAction实现接口ServletRequestAware 并实现方法setServletRequest。可以注入HttpRequest实例,通过request.getSession()获得HttpSession

顾挽 2021-12-02 05:58:36

异常原因分析:因为action加了注解,而容器使用的是ApplicationContext(默认启动容器立即加载Bean)。在action中使用了父类BaseAction的属性session,所以启动Spring容器时就会调用session的初始化方法ServletActionContext.getRequest()

.getSession();此时,没有用户访问,也就没有请求,所以request为空,调用.getSession()方法时报空指针。

秋意浓 2021-12-02 05:58:35

自己顶 

皇甫轩 2021-12-02 05:58:34

可以说的详细点吗?

三月梨花 2021-12-02 05:58:29

回复
实现“org.apache.struts2.interceptor.SessionAware“即可

疾风者 2021-12-02 05:56:58

回复
谢谢,还有一个问题:spring配置action时该使用单例还是其他的作用域?

情绪失控 2021-12-02 05:27:28

回复
这个拿到的是map不是HttpSession @Override public void setSession(Map<String, Object> session) { this.session=session; }

各自安好 2021-12-02 01:24:27

回复
没毛病啊,不就是存值取值嘛,这里面的值和httpsession的值是对应的。@controller注解原先是给springmvc使用的,默认是单例,但是struts2用的时候不要单例,每次请求新建

后知后觉 2021-11-30 19:30:16

要获取session不应该使用这种方式,在省城bean的时候这个方法返回的还是空指针,要获取session应该是实现相应的接口,完成依赖注入

虐人心 2021-11-30 13:49:50

真的吗?谢谢。

一个人的旅程 2021-11-29 18:55:11

最优的解决方案就是不用struts2了,改用springmvc,我保证,你用了之后就会再也不想用回来struts2的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文