如何在Spring 3.2.9上使用构造函数注入?

gopyfrb3  于 2023-04-19  发布在  Spring
关注(0)|答案(2)|浏览(168)

给大家点击我的问题,谢谢(我的英文不好)。
我正在开发的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。

voj3qocg

voj3qocg1#

你正在使用一个古老的、不受支持的Spring版本,我强烈建议你升级到受支持的版本(比如5.3.x甚至6,尽管最后一个版本可能是一个太远的桥梁)。
这个错误告诉你什么是错误的,尽管有点神秘。

BeanCreationException(Error creating bean with name...), AopConfigException(could not generate CGLIB...), IllegalArgumentException(Super class has no null constructor but no arguments were given).

null constructor是默认的no-args构造函数,因为在这个版本的Spring中仍然需要它。代理需要一个no-args构造函数,所以你需要添加它。(这个限制在以后的Spring版本中已经取消了)。

@Controller
@RequestMapping("/test/something")
public class TestController {

    private final TestService testService;

    public TestController() {
        this(null);
    }

    @Autowired
    public TestController (TestService testService){
         this.testService = testService;
    }

}

上面的控制器添加了一个无参数的构造函数,因为你的字段是final,你需要给它赋值。我发现最好是把构造函数链起来,这样就调用了this(null),它会用null的值调用TestController(TestService testService)构造函数。
然而,你需要这个构造函数的事实突出了,imho,你有一个更大的问题,那就是你正在使用AOP将一些逻辑应用到类中。在我看来,不知道你在做什么,你应用得太广泛了。

ws51t4hk

ws51t4hk2#

验证您正在TestService类上使用@Service或@Component注解。
还要检查TestService类是否没有参数构造函数,即默认构造函数没有任何参数。

相关问题