`

web启动@Autowired不能自动注入

阅读更多
使用struts2,下面为action代码
Java代码
package com.edar.web.platform;   
  
import org.apache.struts2.convention.annotation.InterceptorRef;   
import org.apache.struts2.convention.annotation.InterceptorRefs;   
import org.apache.struts2.convention.annotation.Namespace;   
import org.apache.struts2.convention.annotation.Result;   
import org.apache.struts2.convention.annotation.Results;   
import org.springframework.beans.factory.annotation.Autowired;   
import org.springframework.beans.factory.annotation.Qualifier;   
import org.springframework.stereotype.Component;   
  
import com.edar.components.AccountBean;   
import com.edar.dao.util.Page;   
import com.edar.model.Account;   
import com.edar.service.platform.AccountService;   
import com.edar.web.struts2.GenericAction;   
@Component  
@Namespace("/platform")   
@InterceptorRefs( { @InterceptorRef("paramsPrepareParamsStack") })   
@Results( { @Result(name = GenericAction.RELOAD, location = "account.action", type = "redirect") })   
public class AccountAction extends GenericAction<AccountBean> {   
    private static final long serialVersionUID = 1900042912756344244L;   
    @Autowired  
    @Qualifier("accountServiceImpl")   
    private AccountService accountService;   
    private AccountBean accountBean;   
    private Page<AccountBean> page = new Page<AccountBean>(16,true);   
    public AccountBean getAccountBean() {   
        return accountBean;   
    }   
  
    public void setAccountBean(final AccountBean accountBean) {   
        this.accountBean = accountBean;   
    }   
  
    public Page<AccountBean> getPage() {   
        return page;   
    }   
  
    public void setPage(final Page<AccountBean> page) {   
        this.page = page;   
    }   
    @Override  
    public String delete(){   
        accountService.delete((Account) dozer.map(accountBean, Account.class));   
        return SUCCESS;   
    }   
  
    @Override  
    public String list(){   
        page = accountService.getPage(accountBean);   
        return SUCCESS;   
    }   
  
    @Override  
    protected void prepareModel(){   
        if(accountBean==null){   
            accountBean = new AccountBean();   
        }else{   
            if(accountBean.getAccountId()!=null){   
                accountBean = (AccountBean)dozer.map(accountService.getAccount(accountBean.getAccountId()),   
                        AccountBean.class);   
            }   
        }   
           
    }   
  
    @Override  
    public String save(){   
        Account account = (Account) dozer.map(accountBean, Account.class);   
        accountService.save(account);   
        accountBean.setAccountId(account.getAccountId());   
        return SUCCESS;   
    }   
  
    public AccountBean getModel() {   
        return accountBean;   
    }   
  
}  

此action的junit测试代码
package com.edar.web.platform;   
  
import org.junit.After;   
import org.junit.AfterClass;   
import org.junit.Assert;   
import org.junit.Before;   
import org.junit.BeforeClass;   
import org.junit.Test;   
import org.springframework.beans.factory.annotation.Autowired;   
  
import com.edar.components.AccountBean;   
import com.edar.test.SpringContextTestCase;   
  
public class AccountActionTest extends SpringContextTestCase{   
       
  
    private static Long accountId;   
    @Autowired  
    private AccountAction accountAction;   
    @BeforeClass  
    public static void setUpBeforeClass() throws Exception {   
    }   
  
    @AfterClass  
    public static void tearDownAfterClass() throws Exception {   
    }   
  
    @Before  
    public void setUp() throws Exception {   
        AccountBean bean = new AccountBean();   
        bean.setName("ysheng53");   
        bean.setMobile("13819181747");   
        bean.setEmail("ysheng53@gmail.com");   
        bean.setPasswd("321");   
        accountAction.setAccountBean(bean);   
    }   
  
    @After  
    public void tearDown() throws Exception {   
    }   
    @Test  
    public void testSave() {   
        String result = accountAction.save();   
        accountId = accountAction.getAccountBean().getAccountId();   
        Assert.assertEquals(AccountAction.SUCCESS, result);   
    }   
    @Test  
    public void testList() {   
        String result = accountAction.list();   
        Assert.assertEquals(AccountAction.SUCCESS, result);   
        Assert.assertTrue(" 结果数小于0了 ",accountAction.getPage().getTotal()>0);   
    }   
  
    @Test(timeout=5000)   
    public void testDelete() {   
        accountAction.getAccountBean().setAccountId(accountId);   
        String result = accountAction.delete();   
        Assert.assertEquals(AccountAction.SUCCESS, result);   
        Assert.assertTrue("<=0",accountAction.getPage().getTotal()<=0);   
    }   
  
}  



注意到action中的代码:
Java代码

@Autowired
@Qualifier("accountServiceImpl")
private AccountService accountService;


现象时,在junit测试代码执行时,accountService能够被注入,但是用tomcat6,在eclipse,wtp中启动时,accountService没有被注入,为null!

问题在查,谁遇到过类似问题;
问题补充
经过测试分析发现:
AccountAction在junit测试时用spring注入进去,而且只有唯一一个;
而在struts2中,每次请求都会有一个AccountAction的实例;

现在的问题是,struts2中新建实例时,那个private AccountService accountService;自动注入无效;


注:使用了Conventian Plugin
分享到:
评论
4 楼 sys53 2010-06-09  
volking 写道
我也有这个问题。不过我发现,属性值能通过构造函数注入,但是还要加一个默认构造函数,否则action初始化错误。

属性注入null, 怎么解决呢?

注:我已经把struts2-spring-plugin放入lib里.

struts.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
        "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<constant name="struts.convention.default.parent.package" value="crud-default" />
	<constant name="struts.convention.package.locators" value="web" />
	<!-- 用于CRUD Action的parent package -->
	<package name="crud-default" extends="convention-default">
		<!-- 基于paramsPrepareParamsStack,
			增加store interceptor保证actionMessage在redirect后不会丢失 -->
		<interceptors>
			<interceptor-stack name="crudStack">
				<interceptor-ref name="store">
					<param name="operationMode">AUTOMATIC</param>
				</interceptor-ref>
				<interceptor-ref name="paramsPrepareParamsStack" />
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="crudStack" />
	</package>
	<!-- 
		使用Convention插件,实现约定大于配置的零配置文件风格.
	           特殊的Result路径在Action类中使用@Result设定. 
	-->

</struts>



struts.properties配置如下:
struts.devMode = true
struts.locale=zh_cn
struts.i18n.encoding=utf-8
struts.objectFactory=spring 


如未解决,请你贴一下你的配置以及相关spring,struts2的包
3 楼 volking 2010-06-05  
我也有这个问题。不过我发现,属性值能通过构造函数注入,但是还要加一个默认构造函数,否则action初始化错误。

属性注入null, 怎么解决呢?

注:我已经把struts2-spring-plugin放入lib里.
2 楼 volking 2010-06-05  
我也有这个问题。不过我发现,属性值能通过构造函数注入,但是还要加一个默认构造函数,否则action初始化错误。

属性注入null,怎么解决呢?
1 楼 sys53 2010-02-22  
经过大量测试
发现struts2-spring没有配置好;

加上相应的包,同时objectFactory设为spring就解决了;

相关推荐

    spring注解实例

    @Autowired注解用于自动注入bean,Spring会根据类型或名称找到匹配的bean进行注入。默认情况下,Spring会根据目标字段或方法的类型寻找匹配的bean。如果存在多个候选bean,可以通过@Qualifier注解指定bean的名称。 ...

    基于框架的Web开发-装配Bean自动装配.doc

    当我们希望Spring自动注入一个依赖时,可以在需要注入的字段或构造函数上使用`@Autowired`。例如,假设我们有一个People类,它需要一个Car对象: ```java import org.springframework.beans.factory.annotation....

    Web服务启动时自动加载Servlet,并读取数据库内容

    在这里,`@Autowired`注解由Spring自动注入`JdbcTemplate`,然后我们可以调用其`query()`方法执行SQL查询,使用`RowMapper`将结果集映射到对象。 总结起来,要实现Web服务启动时自动加载Servlet并读取数据库内容,...

    Java获取Bean的几种方式.pdf

    Spring 2.5引入的@Autowired注解可以自动注入Bean,无需显式调用`getBean()`方法。它可以根据类型或者名称自动匹配和注入Bean。 ```java @Service public class UserService { @Autowired private ...

    spring使用注解暴露remoting服务

    2. **@Autowired**: Spring的@Autowired注解用于自动装配依赖。它可以注入Bean的属性、构造函数、方法和参数。例如,如果我们有一个DAO层的Bean需要注入到Service中,可以这样做: ```java @Service public class ...

    使用Spring框架开发的第一个实例

    你可以使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解标记类,然后通过`@Autowired`注解自动注入依赖。例如: ```java @Service public class ExampleService { @Autowired private ...

    [springBoot系列]--springBoot注解大全.pdf

    `@Autowired` 实现依赖注入,Spring 会自动找到合适的依赖并注入到 Bean 中。`@PathVariable` 用于从 URL 中提取变量,常用于 RESTful API 的参数获取。 `@JsonBackReference` 和 `@JsonManagedReference` 是 ...

    详解Spring基于Annotation的依赖注入实现

    它提供了全面的基础设施支持,包括但不限于依赖注入、面向切面编程(AOP)、数据访问/集成、事务管理、Web模块、测试等等。Spring的核心特性之一就是依赖注入,它通过在运行时自动配置对象及其依赖关系,极大地简化...

    Spring简单框架开发

    在`Computer`类中,不再需要自行创建部件对象,而是通过@Autowired注解让Spring自动注入。例如: ```java @Component public class Computer { @Autowired private Cpu cpu; @Autowired private Memory ...

    spring jdbcTemplate 注入到servlet

    如果你使用的是Spring Boot,可以在`@SpringBootApplication`类的`main`方法中使用`SpringApplication.run()`启动应用,`JdbcTemplate`会自动注入。 4. **使用JdbcTemplate执行SQL**:现在,Servlet已经具备了执行...

    spring依赖注入bean

    在这个例子中,Spring 会自动找到合适的 `Dependency` 实例并注入到 `MyService` 中。 **测试和运行** 在 Java 应用中,我们可以创建一个主类来启动应用程序,并从 Spring 容器中获取 Bean 实例。例如: ```java ...

    SpringBoot自动装配原理(简单易懂)

    自动装配是SpringBoot的一项功能,它通过`@Autowired`注解来自动注入依赖对象,无需显式地在配置文件中声明。SpringBoot会根据类型或名称自动找到合适的bean并注入到需要的对象中。 2. **基于注解的配置** ...

    Spring使用的粗浅理解

    然后在`LoginServiceImpl`中,使用`@Autowired`注解自动注入`LoginDao`: ```java @Service public class LoginServiceImpl implements LoginService { @Autowired private LoginDao dao; // ... } ``` ...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    - 实现ApplicationContextAware接口,Spring会在初始化时自动注入ApplicationContext。 - 使用`@Resource`注解,与`@Autowired`类似,但更适用于字段注入,并且支持JSR 250规范。 - 静态ApplicationContext的...

    基于TestNG+Mockito及自动装配注解的Spring MVC集成测试

    它的自动装配注解(如`@Autowired`)使得我们可以轻松地在bean之间建立依赖关系,而无需显式地在代码中进行实例化。在测试环境中,我们通常会创建一个测试配置类,使用`@Configuration`和`@ComponentScan`注解来定义...

    spring mvc+ibatis+spring注解

    `@Autowired`用于依赖注入,根据类型或名称自动装配bean。`@Scope`定义bean的作用域,如单例(singleton)或多例(prototype)。`@Configuration`和`@Bean`注解组合使用可以替代XML配置,创建和配置bean。 **集成...

    Spring MVC + Hibernate +Annotation

    Spring会自动处理数据访问,只需要通过@Autowired注入SessionFactory。 4. **配置Service层**:Service层是业务逻辑的核心,它通常会调用DAO层的方法。在Service层类上使用@Service注解,同样可以利用@Autowired...

    Spring与IoC系列四:基于注解的依赖注入.rar

    `@Configuration`表示当前类是一个配置类,而`@EnableAutoConfiguration`则会启动Spring Boot的自动配置功能。 在实际开发中,基于注解的DI可以使代码更加简洁,降低了XML配置的工作量。但同时,也要注意过度使用...

    孔浩组织类型—spring测试类实现3

    在测试类中,我们经常使用`@Autowired`注解来注入需要测试的服务、DAO或其他bean。例如,如果我们正在测试一个服务类,我们可以这样写: ```java @SpringBootTest public class MyServiceTest { @Autowired ...

    Java-EE企业级项目开发JavaEE-单元5-任务3-文档检索设计.ppt

    3. Autowired注解:Spring通过@Autowired自动完成Bean的依赖注入。它可以根据类型自动匹配并注入相应的Bean。例如,`@Autowired private SessionFactory sessionFactory;`会自动寻找并注入SessionFactory类型的Bean...

Global site tag (gtag.js) - Google Analytics