it-swarm.com.de

UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit Namen

Ich versuche seit einigen Tagen, Spring CRUD-Anwendung zu erstellen. Ich bin verwirrt ... Ich kann diese Fehler nicht lösen.

org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit dem Namen 'clientController': Nicht erfüllte Abhängigkeit, ausgedrückt durch die Methode 'setClientService', Parameter 0; geschachtelte Ausnahme ist org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit dem Namen 'clientService': Unzufriedene Abhängigkeit, die durch das Feld 'clientRepository' ausgedrückt wird. Die verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine qualifizierende Bean vom Typ 'com.kopylov.repository.ClientRepository' verfügbar: Es wird mindestens eine Bean erwartet, die als Autowire-Kandidat gilt. Abhängigkeitsanmerkungen: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

und das

org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit dem Namen 'clientService': Nicht erfüllte Abhängigkeit, ausgedrückt durch das Feld 'clientRepository'; Die verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine qualifizierende Bean vom Typ 'com.kopylov.repository.ClientRepository' verfügbar: Es wird mindestens eine Bean erwartet, die als Autowire-Kandidat gilt. Abhängigkeitsanmerkungen: {@ 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> {

}

Ich habe viele ähnliche Fragen durchgesehen, aber niemand kann mir helfen.

27
kopylov

Das ClientRepository sollte mit dem Tag @Repository versehen werden. Mit Ihrer aktuellen Konfiguration scannt Spring die Klasse nicht und kennt sie nicht. Zum Zeitpunkt des Bootens und der Verkabelung wird die ClientRepository-Klasse nicht gefunden. 

EDIT Wenn das Hinzufügen des @Repository-Tags nicht hilft, denke ich, dass das Problem jetzt mit ClientService und ClientServiceImpl sein könnte.

Versuchen Sie, die ClientService (Schnittstelle) mit @Service zu kommentieren. Da Sie nur eine einzige Implementierung für Ihren Service haben sollten, müssen Sie mit dem optionalen Parameter @Service("clientService") keinen Namen angeben. Spring generiert es automatisch basierend auf dem Namen der Schnittstelle.

Wie Bruno bereits erwähnt hat, wird der @Qualifier in der ClientController nicht benötigt, da Sie nur eine einzige Implementierung für den Dienst haben. 

ClientService.Java

@Service
public interface ClientService {

    void addClient(Client client);
}

ClientServiceImpl.Java (Option 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 (Option 2/bevorzugt)

@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";
    }
}
14
Alex Roig

Dies kann passieren, weil den verwendeten Pojos der genaue Konstruktor fehlt, den der Dienst benötigt. Versuchen Sie also, alle Konstruktoren für den Pojo oder die Objekte (Modellobjekt) zu generieren, die Ihr ServiceClient verwendet, damit der Client korrekt instanziert werden kann. In Ihrem Fall generieren Sie die Konstruktoren (mit Argumenten) für Ihr Client-Objekt neu (das ist Ihr Modellobjekt).

1
Ricuzzo

Fügen Sie @EntityScan (basePackages = "Paketnamen hier einfügen") über Ihre Hauptklasse hinzu.

1
Shubham Chopra

Beachten Sie, dass das Scannen Ihres Pakets entweder über die XML-Konfiguration oder die auf Anmerkungen basierende Konfiguration korrekt festgelegt ist.

Sie benötigen einen @Repository für Ihre ClientRepository-Implementierung, damit Spring es in einem @Autowired verwenden kann. Da es nicht hier ist, können wir nur vermuten, dass das fehlt.

Als Randbemerkung wäre es sauberer, Ihren @Autowired/@Qualifier direkt auf Ihr Member zu setzen, wenn die Setter-Methode nur für den @Autowired verwendet wird.

@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;

Schließlich brauchen Sie @Qualifier nicht. Gibt es nur eine Klasse, die die Bean-Definition implementiert, können Sie @Qualifier entfernen, sofern Sie nicht mehrere Implementierungen von ClientService und ClientRepository haben.

1
Bruno Delor

Fügen Sie einfach die @Service-Annotation oben in die Serviceklasse ein

0
erdikanik

Ich hatte genau das gleiche Problem, mit einer sehr langen Stack-Spur ... Am Ende der Spur sah ich Folgendes:

InvalidQueryException: Schlüsselbereich 'mykeyspace' ist nicht vorhanden

Ich habe den Keyspace in Cassandra erstellt und das Problem gelöst.

CREATE KEYSPACE mykeyspace
  WITH REPLICATION = { 
   'class' : 'SimpleStrategy', 
   'replication_factor' : 1 
  };
0
Kristof Dombi

Ich habe gerade die Annotation @Repository zur Repository-Schnittstelle und @EnableJpaRepositories ("domain.repositroy-package") zur Hauptklasse hinzugefügt. Es hat gut funktioniert.

0
Nesryna

Überprüfen Sie, ob Ihre Datei in der Konfigurations- oder der Kontext-XML-Datei fehlt

0
Himanshu Shukla

Wenn Sie Spring Boot verwenden, sollte Ihre Haupt-App so sein (nur um Dinge auf einfache Weise zu erstellen und zu verstehen) 

package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....

Stellen Sie sicher, dass Sie @Repository und @Service entsprechend kommentiert haben.

Stellen Sie sicher, dass alle Ihre Pakete unter aaa.bbb.ccc liegen. *

In den meisten Fällen werden durch diese Einrichtung triviale Probleme gelöst. Hier ist ein volles Beispiel. Ich hoffe es hilft.

0
Ajay Kumar

Ich weiß, dass es zu spät erscheint, aber es kann anderen in der Zukunft helfen.

Ich habe den gleichen Fehler und das Problem war, dass Spring Boot mein Servicepaket nicht gelesen hat.

@ComponentScan(basePackages = {"com.example.demo.Services"}) (Sie müssen Ihren eigenen Pfad zum Services-Paket angeben) und in der Klasse demoApplication (Klasse mit Hauptfunktion) und für das Service-Interface muss @Service mit Anmerkungen versehen sein, und die Klasse, die das Service-Interface implementiert, muss mit @Component und anschließend mit autowired versehen werden die Service-Schnittstelle.

0

Wenn Sie ein Feld als Kriterien in der Methodendefinition beschreiben ("findBy"), müssen Sie diesen Parameter an die Methode übergeben. Andernfalls wird die Ausnahme "Unzufriedene Abhängigkeit durch Methodenparameter ausgedrückt" angezeigt.

public interface ClientRepository extends JpaRepository<Client, Integer> {
       Client findByClientId();                ////WRONG !!!!
       Client findByClientId(int clientId);    /// CORRECT 
}

* Ich gehe davon aus, dass Ihre Client-Entität das Attribut clientId hat.

0
ÖMER TAŞCI

Fügen Sie dem JPA-Repo von Spring Data die @Repository-Anmerkung hinzu

0
Sergio

Gemäß documentation sollten Sie die XML-Konfiguration einstellen:

<jpa:repositories base-package="com.kopylov.repository" />
0

Das war die Versionsinkompatibilität, bei der es sich um den Einschluss von Salat handelte. Wenn ich ausgeschlossen habe, hat es bei mir funktioniert.

<!--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>
0
Vaibs

Ich war mit dem gleichen Problem konfrontiert, und es war auch so, als ich es versäumt hatte, meine DAO-Klasse mit Entity-Anmerkungen zu kennzeichnen. Ich versuchte es unten und der Fehler wurde behoben.

/**
*`enter code here`
*/
@Entity <-- was missing earlier
    public class Topic {
        @Id  
        String id;
        String name;
        String desc;

    .
    .
    .
    }
0
Nitish Sharma

Überprüfen Sie die Tabellenstruktur der Client-Tabelle. Wenn die Tabellenstruktur in db nicht mit der Entität übereinstimmt, erhalten Sie diesen Fehler.

Ich hatte diesen Fehler, der auf einen Datentypunterschied des Primärschlüssels zwischen der Db-Tabelle und der Entität zurückzuführen ist. 

0