java - name - UnsatisfiedDependencyException: Error al crear bean con nombre
entitymanagerfactory spring boot error (12)
Durante varios días estoy intentando crear la aplicación Spring CRUD. Estoy confundido. No puedo resolver estos errores.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error al crear bean con el nombre ''clientController'': dependencia insatisfecha expresada a través del parámetro ''setClientService'' del método; la excepción anidada es org.springframework.beans.factory.UnsatisfiedDependencyException: Error al crear bean con el nombre ''clientService'': dependencia insatisfecha expresada a través del campo ''clientRepository''; la excepción anidada es org.springframework.beans.factory.NoSuchBeanDefinitionException: No hay ningún bean calificado del tipo ''com.kopylov.repository.ClientRepository'' disponible: se espera al menos 1 bean que califique como candidato autowire. Anotaciones de dependencia: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}
y esto
org.springframework.beans.factory.UnsatisfiedDependencyException: Error al crear bean con el nombre ''clientService'': dependencia insatisfecha expresada a través del campo ''clientRepository''; la excepción anidada es org.springframework.beans.factory.NoSuchBeanDefinitionException: No hay ningún bean calificado del tipo ''com.kopylov.repository.ClientRepository'' disponible: se espera al menos 1 bean que califique como candidato autowire. Anotaciones de dependencia: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}
Controlador de cliente
@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);
}
}
Repositorio del cliente
public interface ClientRepository extends JpaRepository<Client, Integer> {
}
Revisé muchas preguntas similares, pero ninguna respuesta a ellas no puede ayudarme.
Acabo de agregar la anotación @Repository
a la interfaz del repositorio y @EnableJpaRepositories
("domain.repositroy-package") a la clase principal. Funcionó bien
Agregue la anotación @Repository al repositorio de Spring Data JPA
El ClientRepository debe anotarse con la etiqueta @Repository
. Con su configuración actual, Spring no escaneará la clase y no tendrá conocimiento de ella. En el momento del arranque y el cableado no encontrará la clase ClientRepository.
EDITAR Si agregar la etiqueta @Repository
no ayuda, entonces creo que el problema podría estar ahora con ClientService
y ClientServiceImpl
.
Intente anotar el ClientService
(interfaz) con @Service
. Como solo debe tener una implementación única para su servicio, no necesita especificar un nombre con el parámetro opcional @Service("clientService")
. Spring lo generará automáticamente en función del nombre de la interfaz.
Además, como mencionó Bruno, el @Qualifier
no es necesario en ClientController
ya que solo tiene una implementación única para el servicio.
ClientService.java
@Service
public interface ClientService {
void addClient(Client client);
}
ClientServiceImpl.java (opción 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 (opción 2 / preferido)
@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";
}
}
Eso podría suceder porque los pojos que está utilizando carecen del constructor preciso que necesita el servicio. Es decir, intente generar todos los constructores para el pojo u objetos (objeto modelo) que utiliza su cliente de servicio, para que el cliente pueda ser instanciado correctamente. En su caso, regenere los constructores (con argumentos) para su objeto cliente (este es su objeto modelo).
Intente agregar @EntityScan (basePackages = "inserte el nombre del paquete aquí") sobre su clase principal.
La aplicación debe ubicarse en el mismo directorio que el paquete escaneado:
Me enfrentaba al mismo problema, y lo fue, ya que no pude marcar mi clase DAO con anotaciones de Entidad. Lo intenté a continuación y el error se resolvió.
/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic {
@Id
String id;
String name;
String desc;
.
.
.
}
Según la documentation debe establecer la configuración XML:
<jpa:repositories base-package="com.kopylov.repository" />
Si describe un campo como criterio en la definición del método ("findBy"), debe pasar ese parámetro al método, de lo contrario obtendrá la excepción "Dependencia insatisfecha expresada a través del parámetro del método".
public interface ClientRepository extends JpaRepository<Client, Integer> {
Client findByClientId(); ////WRONG !!!!
Client findByClientId(int clientId); /// CORRECT
}
* Supongo que su entidad cliente tiene un atributo clientId.
Teniendo en cuenta que la exploración de su paquete se establece correctamente a través de la configuración XML o la configuración basada en anotaciones.
También necesitará un @Repository
en su implementación de ClientRepository
para permitir que Spring lo use en un @Autowired
. Como no está aquí, solo podemos suponer que eso es lo que falta.
Como nota al margen, sería más limpio poner su @Autowired
/ @Qualifier
directamente en su miembro si el método de establecimiento solo se usa para @Autowired
.
@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;
Por último, no necesita el @Qualifier
ya que solo hay una clase que implementa la definición del bean, por lo que, a menos que tenga varias implementaciones de ClientService
y ClientRepository
, puede eliminar el @Qualifier
Tuve exactamente el mismo problema, con un rastro de pila muy muy largo. Al final del rastro vi esto:
InvalidQueryException: el espacio de claves ''mykeyspace'' no existe
Creé el espacio de teclas en Cassandra, y resolví el problema.
CREATE KEYSPACE mykeyspace
WITH REPLICATION = {
''class'' : ''SimpleStrategy'',
''replication_factor'' : 1
};
Verifique la estructura de la tabla de la tabla del Cliente, si hay una falta de coincidencia entre la estructura de la tabla en db y la entidad, obtendría este error ...
Tuve este error que venía debido a la falta de coincidencia del tipo de datos de la clave principal entre la tabla db y la entidad ...