伙计,
我正在尝试使用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注入服务或将服务注入模型。
有没有办法在春天尝试注入时进行调试(如果是的话,在我的情况下)?
任何指针都非常感谢。提前谢谢。
答案 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
的构造函数当你创建它时。