web-dev-qa-db-ja.com

あなたの設定でタイプ 'package'のbeanを定義することを検討してください[Spring-Boot]

次のようなエラーが表示されます。

***************************
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;
}

ApplicantImpl

@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;
    }
}

これで、Autowire Applicantだけを使用してアクセスできるようになるはずですが、この場合は@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";
    }

}

------------------------ UPDATE 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()を追加する前にApplicant内のRestControllerを扱うすべてをコメントアウトすると、UIという文字列を返すことができました。つまり、RestControllerは正常に機能していたので、スキップされます。今はWhitelabel Error Pageが醜いです。

--------------------- UPDATE 2 --------------------------- ---

私はそれが文句を言っていた豆の基本パッケージを追加しました。エラー:

***************************
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 {

@Autowires私のリポジトリApplicantImplがそれに入っている私のTApplicantRepositoryクラスについてはまだ不満があります。

58
Drew1208

プロジェクトがさまざまなモジュールに分割されているためかもしれません。

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

あなたの申請者クラスはスキャンされていないようです。デフォルトでは、ルートを@SpringBootApplicationにしたクラスとして始まるすべてのパッケージがスキャンされます。

あなたのmainクラス "WebServiceApplication"が "com.service.something"にあるとすると、 "com.service.something"の下にあるすべてのコンポーネントがスキャンされ、 "com.service.applicant"はスキャンされません。

「WebServiceApplication」がルートパッケージの下に入り、他のすべてのコンポーネントがそのルートパッケージの一部になるようにパッケージを再構築することもできます。あるいは、 "ALL"コンポーネントがSpringコンテナ内でスキャンされ初期化されるように@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})などを含めることができます。

コメントに基づいて更新

あなたがmaven/gradleによって管理されている複数のモジュールを持っているならば、すべての春のニーズはスキャンするためのパッケージです。あなたは "com.module1"をスキャンするようにスプリングに伝えます、そしてあなたは "com.module2"としてそのルートパッケージ名を持つ別のモジュールを持っています、それらのコンポーネントはスキャンされません。 "com" をスキャンして "com.module1."と "com.module2."のすべてのコンポーネントをスキャンするようにspringに指示することもできます。

34
Ameen.M

チャンスがある...
それぞれの実装クラスに@Service@Repositoryアノテーションがない可能性があります。

21
CodeWorld

基本的にこれはあなたが「他のパッケージ」にClass Applicationを持っているときに起こります。例えば:

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

もう少し簡潔な方法は、すべての設定クラスを同じパッケージに入れることです。

14
Carlos Marcano

リポジトリに@Repositoryというアノテーションを付けることで単純化できると思いますが、それはSpring Frameworkによって自動的に有効になります。

これは、Lombokを使用していてフィールドに@RequiredArgsConstructor@NonNullを追加した場合でも、発生する可能性がありますが、一部のフィールドはコンストラクターに挿入されません。これは、同じエラーが発生する可能性の1つにすぎません。

パラメーター0には、見つからなかったタイプMissingBeanNameのBeanが必要

私の場合、エラーは@NonNullを削除した後に問題が起きたコントローラを教えてくれました

1
Dawid Gorczyca

私はオンラインで答えを探しましたが、私の場合には適切な解決策は1つもないようです。最初は、すべて次のようにうまく動作していました。

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

それから私は何かをキャッシュするためにマップを追加しようとしています、そしてそれはこれになります:

@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))を削除し、@Autowired以外のrepositoryserviceそれぞれにMap<String, String>を追加しました。以前と同じように動作します。

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

これが役に立つかもしれないと思います。

1
Hearen

私の場合、ひどい間違いがありました。 @Serviceをサービスインターフェイスに配置しました。

それを修正するために、サービスファイルの実装に@Serviceを追加しました。

0
Mohammad Falahi
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

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

これは@Serviceクラスがabstractとマークされている場合に起こります。

0
Ariel

私の場合、これら二つの選択肢はうまくいった。

  1. //@ComponentScan ({"myapp", "myapp.resources","myapp.services"})インクルード/リストのApplication.classを保持するパッケージ

  2. 単に@EnableAutoConfigurationを追加してください。それは自動的にすべての春の豆を認識します。

0
Sriharsha g.r.v