当前位置: 首页 > 知识库问答 >
问题:

autowire标记的构造函数无效

东门新立
2023-03-14

我有2个服务类,所以在控制器类2@Autowired构造器中,我运行以下异常:

严重:向类[org.springframework.web.context.ContextLoaderListener]org的侦听器实例发送上下文初始化事件时出现异常。springframework。豆。工厂BeanCreationException:autowire标记的构造函数无效:public com。Spring控制器。HomeController(com.spring.service.ProductService)。找到另一个具有“必需”自动连线批注的构造函数:public com。Spring控制器。HomeController(com.spring.service.CustomerService)位于org。springframework。豆。工厂注释。AutowiredAnnotationBeanPostProcessor。org上的determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:242)。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1040)位于org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。在org上创建BeanInstance(AbstractAutowireCapableBeanFactory.java:1013)。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。doCreateBean(AbstractAutowireCapableBeanFactory.java:504)位于org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。在org上创建Bean(AbstractAutowireCapableBeanFactory.java:475)。springframework。豆。工厂支持AbstractBeanFactory 1美元。位于org的getObject(AbstractBeanFactory.java:304)。springframework。豆。工厂支持DefaultSingletonBeanRegistry。org上的getSingleton(DefaultSingletonBeanRegistry.java:228)。springframework。豆。工厂支持AbstractBean工厂。doGetBean(AbstractBeanFactory.java:300)位于org。springframework。豆。工厂支持AbstractBean工厂。getBean(AbstractBeanFactory.java:195)位于org。springframework。豆。工厂支持DefaultListableBeanFactory。org上的预实例化单例(DefaultListableBeanFactory.java:700)。springframework。上下文支持AbstractApplicationContext。finishBeanFactoryInitialization(AbstractApplicationContext.java:760)位于org。springframework。上下文支持AbstractApplicationContext。在org上刷新(AbstractApplicationContext.java:482)。springframework。网状物上下文ContextLoader。在org上配置和刷新WebApplicationContext(ContextLoader.java:403)。springframework。网状物上下文ContextLoader。位于org的initWebApplicationContext(ContextLoader.java:306)。springframework。网状物上下文ContextLoaderListener。contextInitialized(ContextLoaderListener.java:106)位于org。阿帕奇。卡特琳娜。果心标准上下文。listenerStart(StandardContext.java:4766)位于org。阿帕奇。卡特琳娜。果心标准上下文。startInternal(StandardContext.java:5230)位于org。阿帕奇。卡特琳娜。util。生命周期基。在org启动(LifecycleBase.java:183)。阿帕奇。卡特琳娜。果心ContainerBase$StartChild。在org上调用(ContainerBase.java:1396)。阿帕奇。卡特琳娜。果心ContainerBase$StartChild。在java上调用(ContainerBase.java:1386)。基本/java。util。同时发生的未来任务。在org上运行(FutureTask.java:264)。阿帕奇。公猫util。Thread。InlineExecutorService。在java上执行(InlineExecutorService.java:75)。基本/java。util。同时发生的AbstractExecutorService。在org提交(AbstractExecutorService.java:140)。阿帕奇。卡特琳娜。果心集装箱基础。startInternal(ContainerBase.java:919)位于org。阿帕奇。卡特琳娜。果心标准主机。startInternal(StandardHost.java:835)位于org。阿帕奇。卡特琳娜。util。生命周期基。在org启动(LifecycleBase.java:183)。阿帕奇。卡特琳娜。果心ContainerBase$StartChild。在org上调用(ContainerBase.java:1396)。阿帕奇。卡特琳娜。果心ContainerBase$StartChild。在java上调用(ContainerBase.java:1386)。基本/java。util。同时发生的未来任务。在org上运行(FutureTask.java:264)。阿帕奇。公猫util。Thread。InlineExecutorService。在java上执行(InlineExecutorService.java:75)。基本/java。util。同时发生的AbstractExecutorService。在org提交(AbstractExecutorService.java:140)。阿帕奇。卡特琳娜。果心集装箱基础。startInternal(ContainerBase.java:919)位于org。阿帕奇。卡特琳娜。果心标准发动机。startInternal(StandardEngine.java:263)位于org。阿帕奇。卡特琳娜。util。生命周期基。在org启动(LifecycleBase.java:183)。阿帕奇。卡特琳娜。果心标准服务。startInternal(StandardService.java:432)位于org。阿帕奇。卡特琳娜。util。生命周期基。在org启动(LifecycleBase.java:183)。阿帕奇。卡特琳娜。果心StandardServer。startInternal(StandardServer.java:927)位于org。阿帕奇。卡特琳娜。util。生命周期基。在org启动(LifecycleBase.java:183)。阿帕奇。卡特琳娜。启动。卡特琳娜。从java开始(Catalina.java:772)。基本/jdk。内部的反映NativeMethodAccessorImpl。在java上调用0(本机方法)。基本/jdk。内部的反映NativeMethodAccessorImpl。在java上调用(NativeMethodAccessorImpl.java:62)。基本/jdk。内部的反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。基本/java。郎。反思。方法在org调用(Method.java:566)。阿帕奇。卡特琳娜。启动。独自创立在org启动(Bootstrap.java:345)。阿帕奇。卡特琳娜。启动。独自创立main(Bootstrap.java:476)

控制器类

 public class HomeController {
    
    private final CustomerService customerService;
    private final ProductService  productService;
    
     @Autowired
        public HomeController(ProductService productService, CustomerService customerService) {
      this.productService = productService;
      this.customerService = customerService;
    }
    
    
    @RequestMapping(value = { "/CustomerDetailsPage"}, method = RequestMethod.GET)
    public ModelAndView homepage() 
    {
        
        ModelAndView model = new ModelAndView();
        model.setViewName("CustomerDetailsPage");
        return model; 
    }
    
    @RequestMapping(value = {"/addCustomerDetails"}, method = RequestMethod.POST)
    public ModelAndView addCustomerDetails(CustomerDetails cd) 
    {
        customerService.saveCustomer(cd);
        ModelAndView model = new ModelAndView();
        model.setViewName("homepage");
        return model;
    }

服务等级

@Service
@Transactional
public class CustomerService  {
    
    private final CdRepo cdRepo;
     
    @Autowired
    public CustomerService(CdRepo cdRepo) {
        
        this.cdRepo = cdRepo;
    }
    public void saveCustomer(CustomerDetails cd) 
    {       
        cdRepo.save(cd);
    }

另一个服务等级

@Service
@Transactional
public class ProductService  {

    private final ProductRepo productRepo;
    private final StoredProcedureCall spCall;
    
    @Autowired
    public ProductService(ProductRepo productRepo,StoredProcedureCall spCall) 
    {       
        this.productRepo = productRepo;
        this.spCall = spCall;
    }   
    public void saveProduct(Product product) throws SQLException 
    {
        productRepo.save(product);
        spCall.Procedure();     
    }

共有1个答案

慕永年
2023-03-14

研究Lombok,尤其是@必需的ArgsContructor。如果你编写自己的,你需要有一个用@Autowire和2个参数注释的构造函数:

    @Autowired
    public HomeController(ProductService productService, CustomerService customerService) {
  this.productService = productService;
  this.customerService = customerService;
}
 类似资料:
  • 因此,由于我一直在使用spring,如果我要编写一个具有依赖项的服务,我将执行以下操作: 我现在运行了使用另一个约定来实现相同目标的代码 这两种方法都会奏效,我明白。但是使用选项B有什么好处吗?对我来说,它在类和单元测试中创建了更多的代码。(必须编写构造函数,不能使用@InjectMocks) 是不是我漏了什么?autowired构造函数除了向单元测试添加代码之外,还有其他的功能吗?这是一种更好的

  • 问题内容: 因此,由于我一直在使用Spring,所以如果我要编写一个具有依赖项的服务,我将执行以下操作: 我现在遇到了使用另一种约定实现相同目标的代码 我知道这两种方法都行得通。但是使用选项B有一些好处吗?对我来说,它在类和单元测试中创建了更多代码。(必须编写构造函数,而不能使用@InjectMocks) 有什么我想念的吗?除了将代码添加到单元测试中之外,自动装配构造函数还有其他功能吗?这是进行依

  • 问题内容: 我正在尝试使用来在我的Android应用中设置位置更新,但出现以下错误: LocationRequest构造函数被标记为内部,不应从应用程序访问 我的位置更新请求如下所示: 我遵循了docs和example,它们以相同的方式进行操作。如果不应该打电话给我,那么正确的方法是什么? 问题答案: 使用静态方法。

  • 我正在浏览hibernate留档,文档说hibernate需要为我们所有的持久类提供一个no-arg构造函数: 无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。 但是当我通过创建一个没有任何无参数构造函数的POJO类并放置一个接受参数的构造函数来创建一个示例程序

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • 问题内容: 我有一条记录,想要向其中添加默认构造函数。 但是它创建了带参数的构造函数。 我们如何向记录添加默认构造函数? 问题答案: 为了分裂头发,您永远无法定义默认构造函数,因为在没有定义构造函数的情况下,编译器会生成默认构造函数,因此根据定义,任何定义的构造函数都不是默认构造函数。 如果希望记录具有无参数构造函数,则记录确实允许添加额外的构造函数或工厂方法,只要调用将所有记录字段作为参数的“规