使用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
分享到:
相关推荐
@Autowired注解用于自动注入bean,Spring会根据类型或名称找到匹配的bean进行注入。默认情况下,Spring会根据目标字段或方法的类型寻找匹配的bean。如果存在多个候选bean,可以通过@Qualifier注解指定bean的名称。 ...
当我们希望Spring自动注入一个依赖时,可以在需要注入的字段或构造函数上使用`@Autowired`。例如,假设我们有一个People类,它需要一个Car对象: ```java import org.springframework.beans.factory.annotation....
在这里,`@Autowired`注解由Spring自动注入`JdbcTemplate`,然后我们可以调用其`query()`方法执行SQL查询,使用`RowMapper`将结果集映射到对象。 总结起来,要实现Web服务启动时自动加载Servlet并读取数据库内容,...
Spring 2.5引入的@Autowired注解可以自动注入Bean,无需显式调用`getBean()`方法。它可以根据类型或者名称自动匹配和注入Bean。 ```java @Service public class UserService { @Autowired private ...
2. **@Autowired**: Spring的@Autowired注解用于自动装配依赖。它可以注入Bean的属性、构造函数、方法和参数。例如,如果我们有一个DAO层的Bean需要注入到Service中,可以这样做: ```java @Service public class ...
你可以使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解标记类,然后通过`@Autowired`注解自动注入依赖。例如: ```java @Service public class ExampleService { @Autowired private ...
`@Autowired` 实现依赖注入,Spring 会自动找到合适的依赖并注入到 Bean 中。`@PathVariable` 用于从 URL 中提取变量,常用于 RESTful API 的参数获取。 `@JsonBackReference` 和 `@JsonManagedReference` 是 ...
它提供了全面的基础设施支持,包括但不限于依赖注入、面向切面编程(AOP)、数据访问/集成、事务管理、Web模块、测试等等。Spring的核心特性之一就是依赖注入,它通过在运行时自动配置对象及其依赖关系,极大地简化...
在`Computer`类中,不再需要自行创建部件对象,而是通过@Autowired注解让Spring自动注入。例如: ```java @Component public class Computer { @Autowired private Cpu cpu; @Autowired private Memory ...
如果你使用的是Spring Boot,可以在`@SpringBootApplication`类的`main`方法中使用`SpringApplication.run()`启动应用,`JdbcTemplate`会自动注入。 4. **使用JdbcTemplate执行SQL**:现在,Servlet已经具备了执行...
在这个例子中,Spring 会自动找到合适的 `Dependency` 实例并注入到 `MyService` 中。 **测试和运行** 在 Java 应用中,我们可以创建一个主类来启动应用程序,并从 Spring 容器中获取 Bean 实例。例如: ```java ...
自动装配是SpringBoot的一项功能,它通过`@Autowired`注解来自动注入依赖对象,无需显式地在配置文件中声明。SpringBoot会根据类型或名称自动找到合适的bean并注入到需要的对象中。 2. **基于注解的配置** ...
然后在`LoginServiceImpl`中,使用`@Autowired`注解自动注入`LoginDao`: ```java @Service public class LoginServiceImpl implements LoginService { @Autowired private LoginDao dao; // ... } ``` ...
- 实现ApplicationContextAware接口,Spring会在初始化时自动注入ApplicationContext。 - 使用`@Resource`注解,与`@Autowired`类似,但更适用于字段注入,并且支持JSR 250规范。 - 静态ApplicationContext的...
它的自动装配注解(如`@Autowired`)使得我们可以轻松地在bean之间建立依赖关系,而无需显式地在代码中进行实例化。在测试环境中,我们通常会创建一个测试配置类,使用`@Configuration`和`@ComponentScan`注解来定义...
`@Autowired`用于依赖注入,根据类型或名称自动装配bean。`@Scope`定义bean的作用域,如单例(singleton)或多例(prototype)。`@Configuration`和`@Bean`注解组合使用可以替代XML配置,创建和配置bean。 **集成...
Spring会自动处理数据访问,只需要通过@Autowired注入SessionFactory。 4. **配置Service层**:Service层是业务逻辑的核心,它通常会调用DAO层的方法。在Service层类上使用@Service注解,同样可以利用@Autowired...
`@Configuration`表示当前类是一个配置类,而`@EnableAutoConfiguration`则会启动Spring Boot的自动配置功能。 在实际开发中,基于注解的DI可以使代码更加简洁,降低了XML配置的工作量。但同时,也要注意过度使用...
在测试类中,我们经常使用`@Autowired`注解来注入需要测试的服务、DAO或其他bean。例如,如果我们正在测试一个服务类,我们可以这样写: ```java @SpringBootTest public class MyServiceTest { @Autowired ...
3. Autowired注解:Spring通过@Autowired自动完成Bean的依赖注入。它可以根据类型自动匹配并注入相应的Bean。例如,`@Autowired private SessionFactory sessionFactory;`会自动寻找并注入SessionFactory类型的Bean...