给大家点击我的问题,谢谢(我的英文不好)。
我正在开发的Spring版本是3.2.9。它已经被用于Field Injection,如
@Controller
@RequestMapping("/test/something")
public class TestController {
@Autowired
private TestService testService;
}
但是最近,我知道使用构造函数注入比字段注入和设置器注入更安全。
所以我一直在尝试使用构造函数注入,但它不工作。
我试过这个
@Controller
@RequestMapping("/test/something")
public class TestController {
private final TestService testService;
@Autowired
public TestController (TestService testService){
this.testService = testService;
}
}
控制台不断抛出一堆错误。
这是BeanCreationException(创建名称为...的bean时出错)、AopConfigException(无法生成CGLIB...)、IllegalArgumentException(超级类没有空构造函数,但没有给出参数)。
还有,我一直在试着去掉“final”和“@ Autowired”。这是一样的。不起作用。
- 这就是我的项目是如何工作的。
1.
@Controller
@RequestMapping("/test/something")
public class TestController {
@Autowired
private TestService testService;
@RequestMapping(value="/happy.do")
public ModelAndView happything(){
ModelAndView mav = new ModelAndView();
List<HashMap<String, Object>> happyListMap = testService.getHappyList();
mav.addObject("happyListMap", happyListMap);
mav.setViewName("world/happy/list");
return mav;
}
}
2.
public interface TestService {
List<HashMap<String, Object>> getHappyList();
}
3.
@Service("TestService")
public class TestServiceImpl implements TestService {
@Autowired
private TestMapper testMapper;
@Autowired
private HelpMapper helpMapper;
@Override
public List<HashMap<String, Object>> getHappyList(){
int happyPoint = helpMapper.selectHowMuchHappyYouAre();
List<HashMap<String, Object>> happyListMap = testMapper.selectHappyList(happyPoint);
return happyListMap;
}
}
4.
@Mapper("TestMapper")
public interface TestMapper {
List<HashMap<String, Object>> selectHappyList(int happyPoint);
}
5.
testMapper.xml - myBatis
/* select query */
它不应该在spring 3.2.9上工作?我应该使用Field Injection吗?
(添加,项目不能使用Lombok。
2条答案
按热度按时间voj3qocg1#
你正在使用一个古老的、不受支持的Spring版本,我强烈建议你升级到受支持的版本(比如5.3.x甚至6,尽管最后一个版本可能是一个太远的桥梁)。
这个错误告诉你什么是错误的,尽管有点神秘。
null constructor
是默认的no-args构造函数,因为在这个版本的Spring中仍然需要它。代理需要一个no-args构造函数,所以你需要添加它。(这个限制在以后的Spring版本中已经取消了)。上面的控制器添加了一个无参数的构造函数,因为你的字段是
final
,你需要给它赋值。我发现最好是把构造函数链起来,这样就调用了this(null)
,它会用null
的值调用TestController(TestService testService)
构造函数。然而,你需要这个构造函数的事实突出了,imho,你有一个更大的问题,那就是你正在使用AOP将一些逻辑应用到类中。在我看来,不知道你在做什么,你应用得太广泛了。
ws51t4hk2#
验证您正在TestService类上使用@Service或@Component注解。
还要检查TestService类是否没有参数构造函数,即默认构造函数没有任何参数。