次のようなエラーが表示されます。
***************************
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
クラスについてはまだ不満があります。
プロジェクトがさまざまなモジュールに分割されているためかもしれません。
@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
あなたの申請者クラスはスキャンされていないようです。デフォルトでは、ルートを@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に指示することもできます。
チャンスがある...
それぞれの実装クラスに@Service
、@Repository
アノテーションがない可能性があります。
基本的にこれはあなたが「他のパッケージ」に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
もう少し簡潔な方法は、すべての設定クラスを同じパッケージに入れることです。
リポジトリに@Repositoryというアノテーションを付けることで単純化できると思いますが、それはSpring Frameworkによって自動的に有効になります。
これは、Lombokを使用していてフィールドに@RequiredArgsConstructor
と@NonNull
を追加した場合でも、発生する可能性がありますが、一部のフィールドはコンストラクターに挿入されません。これは、同じエラーが発生する可能性の1つにすぎません。
パラメーター0には、見つからなかったタイプMissingBeanNameのBeanが必要
私の場合、エラーは@NonNull
を削除した後に問題が起きたコントローラを教えてくれました
私はオンラインで答えを探しましたが、私の場合には適切な解決策は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
以外のrepository
とservice
それぞれにMap<String, String>
を追加しました。以前と同じように動作します。
@Slf4j
@Service
public class SecurityGroupService {
@Autowired
private Repository repository;
@Autowired
private Service service;
Map<String, String> testMap;
}
これが役に立つかもしれないと思います。
私の場合、ひどい間違いがありました。 @Service
をサービスインターフェイスに配置しました。
それを修正するために、サービスファイルの実装に@Service
を追加しました。
@SpringBootApplication
@MapperScan("com.developer.project.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
これは@Serviceクラスがabstractとマークされている場合に起こります。
私の場合、これら二つの選択肢はうまくいった。
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
インクルード/リストのApplication.class
を保持するパッケージ
単に@EnableAutoConfiguration
を追加してください。それは自動的にすべての春の豆を認識します。