考虑在您的配置中定义“package”类型的bean[Spring Boot]

tzdcorbm  于 2022-09-19  发布在  Spring
关注(0)|答案(30)|浏览(304)

我得到以下错误:


***************************

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存储到其中。

wrrgggsh

wrrgggsh1#

这可能是因为项目被分解为不同的模块。

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
iyfamqjs

iyfamqjs2#

有一个机会

您可能在各自的实现类中缺少@Service@Repository@Component注解。

0pizxfdo

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.”中的所有组件

cunj1qz1

cunj1qz14#

基本上,当您的类应用程序在“另一个包”中时会发生这种情况。例如:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

我在Application.class中解决了这个问题

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

另一种不那么优雅的方法是:将所有配置类放在同一个包中

kkih6yb8

kkih6yb85#

就我而言,我犯了一个可怕的错误。我将@Service设置到服务接口。
为了解决这个问题,我将@Service放在服务文件的实现上,它对我很有效。

kninwzqo

kninwzqo6#

如果bean与@Autowired在同一个包中,那么它永远不会引起这样的问题。但是,默认情况下,无法从不同的包访问bean。要修复此问题,请执行以下步骤:
1.在主类中导入以下内容:
导入org.springframework.context.annotation.ComponentScan;
1.在主类上添加注解:

@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}
0mkxixxg

0mkxixxg7#

重要的是:

对于通过搜索通用bean错误消息来到这里的任何人,如果他们实际上试图通过客户端界面上的@FeignClient注解将***外部客户端***添加到他们的Spring Boot应用程序中,上述解决方案都不适用于您。
要解决此问题,您需要将@EnableFeignClients注解添加到应用程序类,如下所示:

@SpringBootApplication
// ... (other pre-existing annotations) ...
@EnableFeignClients // <------- THE IMPORTANT ONE
public class Application {

旁注:在@SpringBootApplication下面添加@ComponentScan(...)是多余的,IDE应该将其标记为这样(至少IntelliJ IDEA这样做)。

o2gm4chl

o2gm4chl8#

如果您正在使用Lombok,并且为字段添加了@RequiredArgsConstructor@NonNull,但某些字段不会被注入构造函数中,也会发生这种情况。这只是获得相同错误的可能性之一。
参数“0”需要找不到类型为MissingBeanName的bean
在我的例子中,错误告诉我问题所在的控制器,在删除@NonNull后,应用程序启动正常

s3fp2yjn

s3fp2yjn9#

在使用Spring Boot 2的Maven多模块项目中,我遇到了一个熟悉的问题。这个问题与子Maven模块中的包命名有关。
@SpringBootApplication封装了许多组件,如-@ComponentScan、@EnableAutoConfiguration、jpa存储库、json序列化等。他将@ComponentScan放置在com.***中。太空包。包的这一部分是com.***。所有模块必须共用空间。
为了固定它:
1.您应该重命名所有模块包。换句话说,您必须在所有Maven模块的所有包中都有相同的父部分。例如-com.******.space
1.此外,您必须将您的入口点移动到此包-com.******.space

watbbzwu

watbbzwu10#

在我的案例中,这两个选项都有效。
1.在//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})中,还包括*列表中包含Application.class的包,或
1.简单地添加@EnableAutoConfiguration;它自动识别所有spring bean。

9q78igpj

9q78igpj11#

我认为您可以通过使用@Repository注解存储库来简化它,然后它将由Spring框架自动启用。

nue99wik

nue99wik12#

在应用程序中添加以下注解后,它对我有效:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
我得到了以下错误:
“中构造函数的参数1需要一个类型为Map器的bean,但找不到该bean:

goqiplq2

goqiplq213#

将Springbootapplication(application.java)文件移动到另一个包解决了我的问题。将其与控制器和存储库分开。

z4bn682m

z4bn682m14#

我在网上寻求答案,但似乎没有一个合适的解决方案来解决我的问题:一开始,一切都很好,如下所示:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

然后,我试图添加一个Map来缓存某些内容,结果如下:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

繁荣

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.

Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

我删除了@AllArgsConstructor(onConstructor = @__(@Autowired)),并为除Map<String, String>之外的每个repositoryservice添加了@Autowired。它就像以前一样。

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

希望这可能有帮助。

zc0qhyus

zc0qhyus15#

如果@Service类被标记为抽象,则可能会发生这种情况。

相关问题