数日間、Spring CRUDアプリケーションを作成しようとしています。よくわかりません。このエラーは解決できません。
org.springframework.beans.factory.UnsatisfiedDependencyException: 'clientController'という名前のBeanの作成エラー:メソッド 'setClientService'パラメーター0で表現された満たされていない依存関係。ネストされた例外はorg.springframework.beans.factory.UnsatisfiedDependencyException:名前 'clientService'のBeanの作成エラー:フィールド 'clientRepository'で表現された満たされていない依存関係。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:タイプ 'com.kopylov.repository.ClientRepository'の修飾Beanなし:自動配線候補として修飾される少なくとも1つのBeanが必要です。依存関係の注釈:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
この
org.springframework.beans.factory.UnsatisfiedDependencyException:名前 'clientService'のBeanの作成エラー:フィールド 'clientRepository'で表現された満たされていない依存関係。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:タイプ 'com.kopylov.repository.ClientRepository'の修飾Beanなし:自動配線候補として修飾される少なくとも1つのBeanが必要です。依存関係の注釈:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
ClientController
@Controller
public class ClientController {
private ClientService clientService;
@Autowired
@Qualifier("clientService")
public void setClientService(ClientService clientService){
this.clientService=clientService;
}
@RequestMapping(value = "registration/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute Client client){
this.clientService.addClient(client);
return "home";
}
}
ClientServiceImpl
@Service("clientService")
public class ClientServiceImpl implements ClientService{
private ClientRepository clientRepository;
@Autowired
@Qualifier("clientRepository")
public void setClientRepository(ClientRepository clientRepository){
this.clientRepository=clientRepository;
}
@Transactional
public void addClient(Client client){
clientRepository.saveAndFlush(client);
}
}
ClientRepository
public interface ClientRepository extends JpaRepository<Client, Integer> {
}
私は多くの同様の質問に目を通しましたが、それらに対する誰の回答も私を助けません。
ClientRepositoryには、@Repository
タグで注釈を付ける必要があります。現在の設定では、Springはクラスをスキャンせず、その知識を持ちません。起動と配線の時点では、ClientRepositoryクラスは見つかりません。
EDIT@Repository
タグの追加が役に立たない場合、問題はClientService
およびClientServiceImpl
にある可能性があります。
ClientService
(インターフェース)に@Service
の注釈を付けてみてください。サービスの実装は1つだけにする必要があるため、オプションのパラメーター@Service("clientService")
で名前を指定する必要はありません。 Springは、インターフェイスの名前に基づいて自動生成します。
また、ブルーノが言及したように、ClientController
には@Qualifier
は必要ありません。これは、サービスの実装が1つしかないためです。
ClientService.Java
@Service
public interface ClientService {
void addClient(Client client);
}
ClientServiceImpl.Java(オプション1)
@Service
public class ClientServiceImpl implements ClientService{
private ClientRepository clientRepository;
@Autowired
public void setClientRepository(ClientRepository clientRepository){
this.clientRepository=clientRepository;
}
@Transactional
public void addClient(Client client){
clientRepository.saveAndFlush(client);
}
}
ClientServiceImpl.Java(オプション2 /優先)
@Service
public class ClientServiceImpl implements ClientService{
@Autowired
private ClientRepository clientRepository;
@Transactional
public void addClient(Client client){
clientRepository.saveAndFlush(client);
}
}
ClientController.Java
@Controller
public class ClientController {
private ClientService clientService;
@Autowired
//@Qualifier("clientService")
public void setClientService(ClientService clientService){
this.clientService=clientService;
}
@RequestMapping(value = "registration", method = RequestMethod.GET)
public String reg(Model model){
model.addAttribute("client", new Client());
return "registration";
}
@RequestMapping(value = "registration/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute Client client){
this.clientService.addClient(client);
return "home";
}
}
これは、使用しているpojoに、サービスが必要とする正確なコンストラクターがないために起こる可能性があります。つまり、serviceClientが使用するpojoまたはオブジェクト(モデルオブジェクト)のすべてのコンストラクターを生成して、クライアントを正しくインスタンス化できるようにします。あなたの場合は、クライアントオブジェクトのコンストラクター(引数付き)を再生成します(tahtはモデルオブジェクトです)。
メインクラスの上に@EntityScan(basePackages = "ここにパッケージ名を挿入")を追加してみてください。
Repositoryインターフェースに@Repository
注釈を追加し、メインクラスに@EnableJpaRepositories
( "domain.repositroy-package")を追加しました。うまくいきました。
Spring Bootを使用している場合、メインアプリは次のようにする必要があります(単純な方法で物事を作成して理解するため)。
package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....
@Repositoryと@Serviceに適切な注釈が付けられていることを確認してください。
すべてのパッケージがaaa.bbb.ccc。*に該当することを確認してください
ほとんどの場合、このセットアップはこれらの種類の些細な問題を解決します。 ここ は本格的な例です。それが役に立てば幸い。
パッケージのスキャンがXML構成または注釈ベースの構成のいずれかによって正しく設定されていることを考慮してください。
Springが@Repository
で使用できるようにするには、ClientRepository
実装にも@Autowired
が必要です。ここにはないので、それが欠落しているとしか想定できません。
補足として、セッターメソッドが@Autowired
にのみ使用される場合は、@Qualifier
/@Autowired
をメンバーに直接配置する方が簡単です。
@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;
最後に、@Qualifier
は必要ありません。Bean定義を実装するクラスは1つだけなので、ClientService
およびClientRepository
を複数実装していない限り、@Qualifier
を削除できます。
サービスクラスの先頭に@Serviceアノテーションを追加するだけです
非常に長いスタックトレースで、まったく同じ問題が発生しました。トレースの終わりに私はこれを見ました:
InvalidQueryException:キースペース「mykeyspace」は存在しません
私はcassandraでキースペースを作成し、問題を解決しました。
CREATE KEYSPACE mykeyspace
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};
Configまたはcontext xmlファイルのいずれかが欠落しているかどうかを確認します
遅すぎるように思えますが、将来は他の人にも役立つかもしれません。
私は同じエラーに直面し、問題はスプリングブートが私のサービスパッケージを読み込まなかったということでしたので、追加します:
@ComponentScan(basePackages = {"com.example.demo.Services"})
(サービスパッケージへの独自のパスを指定する必要があります)クラスdemoApplication
(メイン関数を持つクラス)およびサービスインターフェイスには、注釈付きである必要があります@Service
およびサービスインターフェースを実装するには、@Component
アノテーションを付けてから、サービスインターフェースを自動配線する必要があります。
フィールドをメソッド定義( "findBy")の基準として記述する場合、そのパラメーターをメソッドに渡す必要があります。そうしないと、 "メソッドパラメーターで表現された依存関係が満たされていない"例外が発生します。
public interface ClientRepository extends JpaRepository<Client, Integer> {
Client findByClientId(); ////WRONG !!!!
Client findByClientId(int clientId); /// CORRECT
}
*クライアントエンティティにclientId属性があると仮定します。
@RepositoryアノテーションをSpring Data JPAリポジトリに追加します
documentation に従って、XML設定を設定する必要があります。
<jpa:repositories base-package="com.kopylov.repository" />
それはレタスが含まれていたバージョンの非互換性でした。私が除外したとき、それは私のために働いた。
<!--Spring-Boot 2.0.0 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
私は同じ問題に直面していましたが、DAOクラスにEntity注釈を付けるのを忘れていたためです。私は以下を試しましたが、エラーは解決しました。
/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic {
@Id
String id;
String name;
String desc;
.
.
.
}
Clientテーブルのテーブル構造を確認してください。dbのテーブル構造とエンティティの間に不一致がある場合、このエラーが発生します。
Dbテーブルとエンティティ間のプライマリキーのデータ型の不一致が原因でこのエラーが発生しました...