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