@Autowired在Spring失败了

时间:2014-07-23 17:45:37

标签: java spring spring-mvc dependency-injection

伙计,
我正在尝试使用Spring DI和MVC(版本3.2.x)设置项目。我尝试注入服务实现,但在某些时候失败了。没有异常被抛出。只是服务对象在预期的位置为null。 下面是代码。

package com.test.domain.web.controller;
.........
@Controller
@RequestMapping(value = "/system/**")
public class InformationController {
@RequestMapping(value = "/classing/{id}", method = RequestMethod.GET)
public ModelAndView getBaleClassing(@PathVariable String id, Model model, HttpServletRequest request) {
    LOG.info("In the system classing...");
    InformationModel informationModel = new InformationModel();
    model.addAttribute("informationModelVO",informationModel.getResult(id));
    return new ModelAndView(SYSTEM_CLASSING_TILE);
}

}


这是业务的模型类。我也尝试在setter方法中注释@Autowired。但没有运气。

package com.test.domain.classing.model;
.........
public class InformationModel  {

@Autowired
InformationService informationService;

public  InformationVO getResult(String id) {
    InformationVO informationVO = null;
    try {
        informationVO = informationService.getInformationById(id); //informationService is null here
    } catch (ServiceException e) {
        LOG.error("Exception: ", e);
    }
    return informationVO;
}

public InformationService getInformationService() {
    return informationService;
}

public void setInformationService(InformationService informationService) {
    this.informationService = informationService;
}
}


这是我的服务实施,唯一合格的候选人。我依靠Spring来实例化,并且我不会在任何地方实例化服务或DAO实现。

package com.test.domain.classing.service;
.......
public class InformationServiceImpl implements InformationService {

    @Autowired
    private InformationDAO informationDAO;

    public InformationServiceImpl() {
        LOG.debug("In the InformationServiceImpl default constructor....");
    }

    public InformationVO getResult(String id) throws ServiceException {
        InformationVO informationVO = informationDAO.getResult(id);
        return informationVO;
    }

    public InformationDAO getInformationDAO() {
        return informationDAO;
    }

    public void setInformationDAO(InformationDAO informationDAO) {
        this.informationDAO = informationDAO;
    }
}

而且,这是spring配置(包含service和dao)。我没有在spring配置中添加InformationModel,因为我每次都需要新的实例。

的applicationContext.xml


..........
<context:annotation-config />
<context:component-scan base-package="com.test.domain, com.test.domain.classing.model, com.test.domain.classing.service, com.test.domain.web.controller" />

<bean name="com.test.domain.classing.service.InformationService"  class="com.test.domain.classing.service.InformationServiceImpl">
</bean>

<bean name="com.test.domain.classing.dao.InformationDAO" class="com.test.domain.classing.dao.InformationDAOImpl">
</bean>
..........

mvcContext.xml


<context:component-scan base-package="gov.usda.fsa.pscao.clg.cops.web.controller" />
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />


从日志中,我可以说实例化了DAO和服务的实现。但没有一个自动装配发生。即将DAO注入服务或将服务注入模型。 有没有办法在春天尝试注入时进行调试(如果是的话,在我的情况下)?

任何指针都非常感谢。提前谢谢。

3 个答案:

答案 0 :(得分:2)

Spring @Autowired注入只能在spring托管组件中工作。你的InformationModel不是一个Spring托管组件,你试图用new实例化,所以它失败了。如果你想使用基于注释的配置那么你可以简单使用@Service和Daos注释服务 在xml配置中使用@Repository或@Component而不是bean定义。

答案 1 :(得分:2)

RPaul是对的,

试试这个:

@Controller
@RequestMapping(value = "/system/**")
public class InformationController {

@Autowired
InformationModel informationModel;

@RequestMapping(value = "/classing/{id}", method = RequestMethod.GET)
public ModelAndView getBaleClassing(@PathVariable String id, Model model, HttpServletRequest request) {
    LOG.info("In the system classing...");
    model.addAttribute("informationModelVO",informationModel.getResult(id));
    return new ModelAndView(SYSTEM_CLASSING_TILE);
}

}

@Component
public class InformationModel  {
....
} 

和这个

@Service
public class InformationServiceImpl implements InformationService {
...
}
祝你好运!

答案 2 :(得分:0)

没有例外意味着根本没有进行Autowire尝试,这反过来意味着您尝试Autowire的类不是由Spring管理的。简单的规则是,如果bean不是由Spring创建的,那么Spring的东西(包括自动装配)都不会起作用。 如果出于某种原因,您每次都需要InformationModel的新实例,那么您最好不要依赖Spring,我只需将所需参数传递给InformationModel的构造函数当你创建它时。