我得到以下错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.
Action:
Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.
我以前从未见过这种错误,但奇怪的是,@Autowire不工作。项目结构如下:
申请人界面
public interface Applicant {
TApplicant findBySSN(String ssn) throws ServletException;
void deleteByssn(String ssn) throws ServletException;
void createApplicant(TApplicant tApplicant) throws ServletException;
void updateApplicant(TApplicant tApplicant) throws ServletException;
List<TApplicant> getAllApplicants() throws ServletException;
}
应用示例
@Service
@Transactional
public class ApplicantImpl implements Applicant {
private static Log log = LogFactory.getLog(ApplicantImpl.class);
private TApplicantRepository applicantRepo;
@Override
public List<TApplicant> getAllApplicants() throws ServletException {
List<TApplicant> applicantList = applicantRepo.findAll();
return applicantList;
}
}
现在,我应该能够自动连接申请者并能够访问,但在这种情况下,当我在@RestController:
中调用它时,它不工作
@RestController
public class RequestController extends LoggingAware {
private Applicant applicant;
@Autowired
public void setApplicant(Applicant applicant){
this.applicant = applicant;
}
@RequestMapping(value="/", method = RequestMethod.GET)
public String helloWorld() {
try {
List<TApplicant> applicantList = applicant.getAllApplicants();
for (TApplicant tApplicant : applicantList){
System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
}
return "home";
}
catch (ServletException e) {
e.printStackTrace();
}
return "error";
}
}
------------------------更新1-----------------------
我补充道
@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
错误消失了,但什么也没发生。然而,当我在添加@ComponentScan()
之前注解掉RestController
中处理Applicant
的所有内容时,我能够返回一个字符串UI
,因此意味着我的RestController
正在工作,现在它被跳过。我现在是丑陋的Whitelabel Error Page
。
---------------------更新2------------------------------
我添加了它所抱怨的bean的基本包。错误显示:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.
Action:
Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.
我添加了@ComponentScan
@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
----------------------------更新3----------------------
增加:
@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {
仍然在抱怨我的ApplicantImpl
类,@Autowires
将我的TApplicantRepository
存储到其中。
30条答案
按热度按时间wrrgggsh1#
这可能是因为项目被分解为不同的模块。
iyfamqjs2#
有一个机会
您可能在各自的实现类中缺少
@Service
、@Repository
或@Component
注解。0pizxfdo3#
您的申请者类别似乎没有被扫描。默认情况下,将扫描以根作为放置
@SpringBootApplication
的类开始的所有包。假设您的
main
类“WebServiceApplication”位于“com.service.something
”中,则扫描“com.service.something
”下的所有组件,并且不会扫描“com.service.applicant
”。您可以重新构造包,使“WebServiceApplication”属于根包,所有其他组件都成为该根包的一部分。或者您可以包括
@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
等,以便在spring容器中扫描和初始化“所有”组件。根据评论更新
如果您有多个模块由maven/gradle管理,那么spring所需要的只是要扫描的包。您告诉spring扫描“com.module1”,如果您有另一个模块,其根包名为“com.module2”,则这些组件将不会被扫描。您甚至可以告诉spring扫描**“com”**然后扫描“
com.module1.
”和“com.module2.
”中的所有组件cunj1qz14#
基本上,当您的类应用程序在“另一个包”中时会发生这种情况。例如:
我在Application.class中解决了这个问题
另一种不那么优雅的方法是:将所有配置类放在同一个包中
kkih6yb85#
就我而言,我犯了一个可怕的错误。我将
@Service
设置到服务接口。为了解决这个问题,我将
@Service
放在服务文件的实现上,它对我很有效。kninwzqo6#
如果bean与@Autowired在同一个包中,那么它永远不会引起这样的问题。但是,默认情况下,无法从不同的包访问bean。要修复此问题,请执行以下步骤:
1.在主类中导入以下内容:
导入org.springframework.context.annotation.ComponentScan;
1.在主类上添加注解:
0mkxixxg7#
重要的是:
对于通过搜索通用bean错误消息来到这里的任何人,如果他们实际上试图通过客户端界面上的
@FeignClient
注解将***外部客户端***添加到他们的Spring Boot应用程序中,上述解决方案都不适用于您。要解决此问题,您需要将
@EnableFeignClients
注解添加到应用程序类,如下所示:旁注:在
@SpringBootApplication
下面添加@ComponentScan(...)
是多余的,IDE应该将其标记为这样(至少IntelliJ IDEA这样做)。o2gm4chl8#
如果您正在使用Lombok,并且为字段添加了
@RequiredArgsConstructor
和@NonNull
,但某些字段不会被注入构造函数中,也会发生这种情况。这只是获得相同错误的可能性之一。参数“0”需要找不到类型为MissingBeanName的bean
在我的例子中,错误告诉我问题所在的控制器,在删除
@NonNull
后,应用程序启动正常s3fp2yjn9#
在使用Spring Boot 2的Maven多模块项目中,我遇到了一个熟悉的问题。这个问题与子Maven模块中的包命名有关。
@SpringBootApplication封装了许多组件,如-@ComponentScan、@EnableAutoConfiguration、jpa存储库、json序列化等。他将@ComponentScan放置在com.***中。太空包。包的这一部分是com.***。所有模块必须共用空间。
为了固定它:
1.您应该重命名所有模块包。换句话说,您必须在所有Maven模块的所有包中都有相同的父部分。例如-com.******.space
1.此外,您必须将您的入口点移动到此包-com.******.space
watbbzwu10#
在我的案例中,这两个选项都有效。
1.在
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
中,还包括*列表中包含Application.class
的包,或1.简单地添加
@EnableAutoConfiguration
;它自动识别所有spring bean。9q78igpj11#
我认为您可以通过使用
@Repository
注解存储库来简化它,然后它将由Spring框架自动启用。nue99wik12#
在应用程序中添加以下注解后,它对我有效:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
我得到了以下错误:
“中构造函数的参数1需要一个类型为Map器的bean,但找不到该bean:
goqiplq213#
将Springbootapplication(application.java)文件移动到另一个包解决了我的问题。将其与控制器和存储库分开。
z4bn682m14#
我在网上寻求答案,但似乎没有一个合适的解决方案来解决我的问题:一开始,一切都很好,如下所示:
然后,我试图添加一个Map来缓存某些内容,结果如下:
繁荣
我删除了
@AllArgsConstructor(onConstructor = @__(@Autowired))
,并为除Map<String, String>
之外的每个repository
和service
添加了@Autowired
。它就像以前一样。希望这可能有帮助。
zc0qhyus15#
如果@Service类被标记为抽象,则可能会发生这种情况。