Considere la posibilidad de definir un bean de tipo 'paquete' en su configuración [Spring-Boot]

108

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 Applicantel RestControllerantes de añadir @ComponentScan()que era capaz de devolver una cadena de la UI, por lo tanto significa que mi RestControllerestaba trabajando, ahora está siendo saltado. Soy feo Whitelabel Error Pageahora.

--------------------- 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 ApplicantImplclase que @Autowiresmi repositorio TApplicantRepositoryen ella.

Mike3355
fuente
¿Dónde está el archivo de contexto de su aplicación? Si no tiene uno, debería considerar darle a Spring alguna pista con anotaciones como @ComponentScan para que todos los beans estén disponibles.
Mario Santini
@MarioSantini, consulte la actualización 1
Mike3355
¿Supongo que después de cada actualización hubo cambios en los errores? Si es posible, publique la estructura de su proyecto y los registros de error / seguimiento de pila en cada caso. Es mejor saber "Por qué" ocurrieron esos errores, en lugar de "algo" que hizo que el error desapareciera. También será útil para otras personas que se encuentren con un problema similar.
Ameen.M

Respuestas:

201

Puede deberse a que el proyecto se ha dividido en diferentes módulos.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
Mike3355
fuente
5
Frio. Mi proyecto se divide en varios módulos. ComponentScan resolvió mi problema.
kholofelo Maloma
La anotación ComponentScan resuelve mi problema, pero @EnableAutoConfiguration no lo hace
jpl
De hecho, EnableAutoConfiguration define implícitamente un “paquete de búsqueda” base para ciertos elementos y el uso de un paquete raíz también permite que se use la anotación ComponentScan sin necesidad de especificar un atributo basePackage. Y la anotación @SpringBootApplication podría usarse si su clase principal está en el paquete raíz
jpl
1
Esta solución me ayudó con este error en la versión 2.0.4
manu muraleedharan
2
Sí, se debe a que el proyecto se ha dividido en diferentes módulos. @EntityScany @EnableJpaRepositoriescon los nombres de paquetes correctos funcionó para mí.
Adi Sivasankaran
51

Hay una posibilidad ...
Es posible que falte @Service, @Repositoryanotación en sus respectivas clases de implementación.

CodeWorld
fuente
2
Esta debería ser la respuesta aceptada, simple y precisa. Gracias.
Nightfury
1
Trabajó para mi. Gracias.
Okafor T Kosiso
1
Gracias, me faltaba la anotación de
@Repository
1
Sí, esta debería ser la respuesta. Las respuestas anteriores simplemente suponen que el escaneo falló, lo cual es incorrecto.
Sumit Badsara
48

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 mainclase "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."

Ameen.M
fuente
Mi proyecto es estructura en diferentes módulos. Por ejemplo, los servicios tendrán su propio módulo y build.gradle. Estos build.gradlenombres de módulo se agregan al dependenciesmódulo con el método principal. Por lo tanto, cuando lo vio @ComponentScan("module-service"), pensé que eso funcionaría. Sin embargo, el interior module-servicetiene 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?
Mike3355
No importa si los paquetes se dividen en módulos diferentes. Los paquetes en los que se deben escanear los componentes deben especificarse en primavera. Puede dar todos los nombres de paquetes "raíz" de todos sus módulos en el atributo "scanBasePackages". Y todos los "paquetes" que deben mencionarse, no los módulos.
Ameen.M
Hizo lo que dijo y el error desapareció, pero solo para quejarse de otro paquete. Naturalmente, lo agregué a la lista, pero no desaparecerá. Lo implementé así:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355
Acabo de hacerlo @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.
Mike3355
23

Básicamente, esto sucede cuando tienes tu Solicitud de Clase en "otro paquete". Por ejemplo:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Resuelvo el problema con esto en Application.class

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

Otra forma menos elegante es: poner todas las clases de configuración en el mismo paquete.

Carlos Marcano
fuente
2
De hecho, no es necesario especificar @ComponentScanen el escenario anterior. Porque su Application.class(que tiene la @SpringBootApplicationanotación) se coloca en lo com.serverque es de todos modos la raíz para ambos com.server.configy com.server.repository.
Ameen.M
@ Ameen.M Esa es mi pregunta exacta, ¿por qué todavía no se puede resolver y por qué requiere un escaneo explícito para el uso de repositorios mongo @EnableMongoRepositories?
Karthikeyan
10

En mi caso tuve un terrible error. pongo@Service la interfaz de servicio.

Para solucionarlo, puse @Servicela implementación del archivo de servicio y funcionó para mí.

Mohammad Falahi
fuente
Lo mismo para mi. Gracias
Manta
7

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:

  1. Importe lo siguiente en su clase principal:
    import org.springframework.context.annotation.ComponentScan;
  2. agregue una anotación sobre su clase principal:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}
ASHWANI PANDEY
fuente
5

Creo que puede simplificarlo anotando su repositorio con @Repository, luego Spring Framework lo habilitará automáticamente.

Tushar Saha Chowdhury
fuente
4

En mi caso, estas dos opciones funcionaron.

  1. en //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) incluir también el paquete que contiene el Application.classen la lista, o

  2. Simplemente agregue @EnableAutoConfiguration; reconoce automáticamente todos los frijoles de primavera.

Sriharsha grv
fuente
3

Esto también puede suceder si está utilizando Lombok y agrega los campos @RequiredArgsConstructory @NonNullfor, pero algunos de sus campos no deben inyectarse en el constructor. Esta es solo una de las posibilidades de obtener el mismo error.

el parámetro 0 requería un bean de tipo MissingBeanName que no se pudo encontrar

En mi caso, el error me dijo en qué controlador estaba el problema, después de eliminar @NonNullla aplicación comenzó bien

Dawid Gorczyca
fuente
3

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:

  1. Debe cambiar el nombre de todos los paquetes de módulos. Otras palabras que tenía que tener en todos los paquetes en todos los módulos de Maven: la misma parte principal. Por ejemplo, com. *******. Space
  2. También debe mover su punto de entrada a este paquete - com. *******. Space
alexis_druzik
fuente
2

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:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Luego estoy tratando de agregar un mapa para almacenar en caché algo y se convierte en esto:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

¡Auge!

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.

Quité @AllArgsConstructor(onConstructor = @__(@Autowired))y agregué @Autowiredpara cada uno repositoryy serviceexcepto el Map<String, String>. Simplemente funciona como antes.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

Espero que esto pueda ser útil.

Hearen
fuente
2

Funcionó para mí después de agregar la siguiente anotación en la aplicación:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Recibí el siguiente error:

"El parámetro 1 del constructor requiere un bean de tipo mapeador que no se pudo encontrar:

Amor Kumar
fuente
2

@ La anotación de configuración simplemente resolverá el error

oludamilare olukotun
fuente
2

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ó.

Ross Mills
fuente
1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
desarrollador07
fuente
1

Esto puede suceder si la clase @Service está marcada como abstracta.

Ariel
fuente
1

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.

Arif Khan
fuente
1

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

Staxx
fuente
1

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.

usuario13650952
fuente
0

En mi caso, este error aparece porque mi importación fue incorrecta, por ejemplo, al usar Spring, la importación aparece automáticamente:

import org.jvnet.hk2.annotations.Service;

pero necesitaba:

import org.springframework.stereotype.Service;
Washington da Silva
fuente
0

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

usuario11976602
fuente
0

Mi error fue que había incluido:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

en vez de:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
usuario1441323
fuente
0

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

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}
usuario3709901
fuente
0

Agregar la dependencia de Spring Boot Data JPA Starter resolvió el problema para mí.

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

O puedes ir directamente aquí

Johny Thomas Kariath
fuente
En realidad, esto no se aplica en este caso. Solicita los detalles de la conexión a la base de datos (no se pudo configurar una fuente de datos: el atributo 'url' no está especificado y no se pudo configurar ninguna fuente de datos integrada). En una situación en la que quiero probar manualmente sin interactuar con la base de datos, esto no funcionará.
Thomas Okonkwo
0

Si lo usa interface, puede extender CrudRepository<Applicant,Long>con @Repositoryanotación.

zawhtut
fuente
0

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

redoff
fuente
0

Existe la posibilidad de que esté intentando @autowired una interfaz antes de implementar la interfaz.

solución de ejemplo:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)
biddut
fuente
0

Elimina la configuración del tipo de anotación como @Service del método de ejecución del hilo.

@Service, @Component
Sandun Susantha
fuente
0

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:

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {
Barani r
fuente
0

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.

palomitas de maíz
fuente