Estoy teniendo el siguiente error:
***************************
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.
Nunca he visto este error antes, pero es extraño que @Autowire no esté funcionando. Aquí está la estructura del proyecto:
Interfaz del solicitante
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;
}
SolicitanteImpl
@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;
}
}
Ahora debería poder acceder al Solicitante de Autowire y poder acceder, sin embargo, en este caso no funciona cuando lo llamo en mi @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";
}
}
------------------------ ACTUALIZACIÓN 1 -----------------------
yo añadí
@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);
}
}
y el error desapareció pero no pasó nada. Sin embargo, cuando se lo comenté a cabo todo trato con Applicant
el RestController
antes de añadir @ComponentScan()
que era capaz de devolver una cadena de la UI
, por lo tanto significa que mi RestController
estaba trabajando, ahora está siendo saltado. Soy feo Whitelabel Error Page
ahora.
--------------------- ACTUALIZACIÓN 2 --------------------------- ---
Agregué el paquete base del frijol del que se quejaba. El error dice:
***************************
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.
yo añadí @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);
}
}
---------------------------- Actualización 3 -------------------- -
agregando:
@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {
todavía se está quejando de mi ApplicantImpl
clase que @Autowires
mi repositorio TApplicantRepository
en ella.
fuente
Respuestas:
Puede deberse a que el proyecto se ha dividido en diferentes módulos.
fuente
@EntityScan
y@EnableJpaRepositories
con los nombres de paquetes correctos funcionó para mí.Hay una posibilidad ...
Es posible que falte
@Service
,@Repository
anotación en sus respectivas clases de implementación.fuente
Parece que su clase de solicitante no está escaneada. De forma predeterminada
@SpringBootApplication
, se analizarán todos los paquetes que comiencen con la raíz como la clase donde ha colocado .suponga que su
main
clase "WebServiceApplication" está en "com.service.something
", entonces todos los componentes que caen bajo "com.service.something
" se escanean y "com.service.applicant
" no se escanearán.Puede reestructurar sus paquetes de modo que "WebServiceApplication" se encuentre en un paquete raíz y todos los demás componentes pasen a formar parte de ese paquete raíz. O puede incluir,
@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
etc., de modo que "TODOS" los componentes se escaneen e inicialicen en el contenedor de resorte.Actualización basada en comentario
Si tiene varios módulos administrados por maven / gradle, todo lo que Spring necesita es el paquete para escanear. Le dice a Spring que escanee "com.module1" y tiene otro módulo que tiene su nombre de paquete raíz como "com.module2", esos componentes no serán escaneados. Incluso puede decirle a Spring que escanee "com", que luego escaneará todos los componentes en "
com.module1.
" y "com.module2.
"fuente
build.gradle
. Estosbuild.gradle
nombres de módulo se agregan aldependencies
módulo con el método principal. Por lo tanto, cuando lo vio@ComponentScan("module-service")
, pensé que eso funcionaría. Sin embargo, el interiormodule-service
tiene un paquete. Entonces mi pregunta, ¿cómo sería eso? ¿Solo nombro el nombre del paquete o el nombre del módulo o de alguna manera ambos?@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
@SpringBootApplication(scanBasePackages= "com")
y se queja del repositorio de JPA. Muchas gracias. No sabía que Spring analizaría todos los paquetes que comienzan con "com" si haces lo anterior.Básicamente, esto sucede cuando tienes tu Solicitud de Clase en "otro paquete". Por ejemplo:
Resuelvo el problema con esto en Application.class
Otra forma menos elegante es: poner todas las clases de configuración en el mismo paquete.
fuente
@ComponentScan
en el escenario anterior. Porque suApplication.class
(que tiene la@SpringBootApplication
anotación) se coloca en locom.server
que es de todos modos la raíz para amboscom.server.config
ycom.server.repository
.@EnableMongoRepositories
?En mi caso tuve un terrible error. pongo
@Service
la interfaz de servicio.Para solucionarlo, puse
@Service
la implementación del archivo de servicio y funcionó para mí.fuente
Si un bean está en el mismo paquete en el que está @Autowired, nunca causará tal problema. Sin embargo, los beans no son accesibles desde diferentes paquetes de forma predeterminada. Para solucionar este problema, siga estos pasos:
import org.springframework.context.annotation.ComponentScan;
fuente
Creo que puede simplificarlo anotando su repositorio con @Repository, luego Spring Framework lo habilitará automáticamente.
fuente
En mi caso, estas dos opciones funcionaron.
en
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
incluir también el paquete que contiene elApplication.class
en la lista, oSimplemente agregue
@EnableAutoConfiguration
; reconoce automáticamente todos los frijoles de primavera.fuente
Esto también puede suceder si está utilizando Lombok y agrega los campos
@RequiredArgsConstructor
y@NonNull
for, pero algunos de sus campos no deben inyectarse en el constructor. Esta es solo una de las posibilidades de obtener el mismo error.En mi caso, el error me dijo en qué controlador estaba el problema, después de eliminar
@NonNull
la aplicación comenzó bienfuente
Me enfrenté a un problema familiar en mi proyecto de múltiples módulos de Maven con Spring Boot 2. El problema estaba relacionado con el nombre de mis paquetes en los módulos sub Maven.
@SpringBootApplication encapsula una gran cantidad de componentes como: @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization y así sucesivamente. Y coloca @ComponentScan en el paquete com. *******. Space. Esta parte del espacio de los paquetes com. *******. Debe ser común para todos los módulos.
Para arreglarlo:
fuente
Busqué en línea una respuesta, pero parece que no hay una solución adecuada para mi caso: al principio, todo funciona bien de la siguiente manera:
Luego estoy tratando de agregar un mapa para almacenar en caché algo y se convierte en esto:
¡Auge!
Quité
@AllArgsConstructor(onConstructor = @__(@Autowired))
y agregué@Autowired
para cada unorepository
yservice
excepto elMap<String, String>
. Simplemente funciona como antes.Espero que esto pueda ser útil.
fuente
Funcionó para mí después de agregar la siguiente anotación en la aplicación:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Recibí el siguiente error:
fuente
@ La anotación de configuración simplemente resolverá el error
fuente
También obtendrá este error si define accidentalmente el mismo bean en dos clases diferentes. Eso me paso a mi. El mensaje de error fue engañoso. Cuando eliminé el bean extra, el problema se resolvió.
fuente
fuente
Esto puede suceder si la clase @Service está marcada como abstracta.
fuente
Si Spring administra la dependencia de su clase, entonces este problema puede ocurrir si olvidamos agregar un constructor arg predeterminado / vacío dentro de nuestra clase POJO.
fuente
Podría ayudar a alguien. Tuve el mismo problema, el mismo mensaje de error, lo mismo todo. Probé soluciones de otras respuestas, no ayudó hasta que me di cuenta de que el bean que estoy usando tiene el mismo nombre que el que realmente se ha conectado automáticamente. Ocurrió en medio de la refactorización, por lo que tuve que cambiar el nombre de la clase, lo que resultó positivo. Salud
fuente
Me enfrenté al mismo problema. El repositorio de Mongo DB fue identificado por Spring boot, pero no estaba creando Bean para una interfaz de repositorio que extendiera el repositorio de mongo.
El problema en mi caso fue la especificación incorrecta de la versión en maven pom para "spring + mango". Cambié la identificación del grupo del artefacto y todo funcionó como magia. no se necesitan anotaciones ya que Spring Boot se encargó de todo.
Durante la resolución de mi problema, estaba por toda la web buscando soluciones y me di cuenta de que este problema en realidad está relacionado con la configuración del proyecto, cualquier persona que enfrente este problema debe verificar primero la configuración de su proyecto y habilitar la depuración de Spring para obtener más detalles sobre fallas y prestar mucha atención a dónde exactamente en el proceso, la creación ha fallado.
fuente
En mi caso, este error aparece porque mi importación fue incorrecta, por ejemplo, al usar Spring, la importación aparece automáticamente:
pero necesitaba:
fuente
Tuve un caso en el que necesito inyectar RestTemplate en una clase de servicio. Sin embargo, la clase de servicio no puede recoger RestTemplate. Lo que hice fue crear una clase de contenedor en el mismo paquete que la aplicación principal y marcar el contenedor como Componente y conectar automáticamente este componente en la clase de servicio. Problema resuelto. espero que también funcione para ti
fuente
Mi error fue que había incluido:
en vez de:
fuente
Creo que le falta la anotación @Bean en su RequestController
Agregue el Bean en su archivo, esto resolvió mi problema
Obtuve esta solución mientras estaba aprendiendo Spring Boot desde tutorialspoint
fuente
Agregar la dependencia de Spring Boot Data JPA Starter resolvió el problema para mí.
Maven
Gradle
O puedes ir directamente aquí
fuente
Si lo usa
interface
, puede extenderCrudRepository<Applicant,Long>
con@Repository
anotación.fuente
El problema también puede aparecer cuando usa por ejemplo
@EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)
y luego cambia el nombre del paquete o lo mueve a otro lugar.Muy a menudo lo enfrenté dentro de un proyecto maven de múltiples módulos y un arranque de primavera
fuente
Existe la posibilidad de que esté intentando @autowired una interfaz antes de implementar la interfaz.
solución de ejemplo:
fuente
Elimina la configuración del tipo de anotación como @Service del método de ejecución del hilo.
fuente
Intente configurar la estructura del proyecto como se indica a continuación:
Coloque todos los paquetes de repositorio, servicio y paquetes en el paquete secundario del paquete principal:
fuente
recordatorio de que Spring no escanea el mundo, utiliza escaneo dirigido, lo que significa todo lo que se encuentra debajo del paquete donde se almacena la aplicación springboota. por lo tanto, este error "Considere definir un bean de tipo 'paquete' en su configuración [Spring-Boot]" puede aparecer porque tiene interfaces de servicios en un paquete de aplicación springboota diferente.
fuente