org - required a bean of type java lang string that could not be found
Considere definir un bean de tipo ''paquete'' en su configuraciĆ³n (14)
Básicamente, esto sucede cuando tiene su 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 la clase 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.
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 antes había visto este error, pero es extraño que @Autowire no funcione. 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 solo conectar automáticamente al solicitante 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 comenté todo lo relacionado con el
Applicant
en el
RestController
antes de agregar
@ComponentScan()
, pude devolver una cadena a la
UI
, lo que significa que mi
RestController
estaba funcionando, ahora se está omitiendo.
Yo feo
Whitelabel Error Page
ahora.
--------------------- ACTUALIZACIÓN 2 --------------------------- ---
Agregué el paquete base del bean del que se quejaba. Error lee:
***************************
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.
@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 queja de mi clase
ApplicantImpl
que
@Autowires
mi repositorio
TApplicantRepository
en él.
Busqué una respuesta en línea, 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 algo en caché 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.
@AllArgsConstructor(onConstructor = @__(@Autowired))
y
@Autowired
para cada
repository
y
service
excepto
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.
Creo que puede simplificarlo anotando su repositorio con @Repository, entonces Spring Framework lo habilitará automáticamente.
En mi caso tuve un terrible error.
Puse
@Service
hasta la interfaz de servicio.
Para solucionarlo, puse
@Service
en la implementación del archivo de servicio y funcionó para mí.
En mi caso, estas dos opciones funcionaron.
-
en
//@ComponentScan ({"myapp", "myapp.resources","myapp.services"})
incluye también el paquete que contiene elApplication.class
en la lista, o -
Simplemente agregue
@EnableAutoConfiguration
; reconoce automáticamente todos los frijoles de primavera.
En mi caso, este error aparece porque mi importación fue incorrecta, por ejemplo, usando spring, la importación aparece automáticamente:
import org.jvnet.hk2.annotations.Service;
pero necesitaba
import org.springframework.stereotype.Service;
Esto puede suceder si la clase @Service está marcada como abstracta.
Esto también puede suceder si está utilizando Lombok y agrega
@RequiredArgsConstructor
y
@NonNull
para los campos, pero algunos de sus campos no deben inyectarse en el constructor.
Esta es solo una de las posibilidades para 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
@NonNull
la aplicación comenzó bien
Funcionó para mí después de agregar la anotación a continuación en la aplicación:
@ComponentScan({"com.seic.deliveryautomation.mapper"})
Estaba recibiendo el siguiente error:
"el parámetro 1 del constructor requiere un bean de tipo mapper que no se pudo encontrar:
Puede ser porque 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 {
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 por defecto. Para solucionar este problema, siga estos pasos:
-
Importar siguiente en su clase principal:
import org.springframework.context.annotation.ComponentScan; - agregue anotaciones sobre su clase principal:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringExampleApplication.class, args);
}
}
Su clase de solicitante no se escanea, al parecer.
De forma predeterminada, se analizarán todos los paquetes que comiencen con la raíz como la clase donde ha puesto
@SpringBootApplication
.
supongamos que su clase
main
"WebServiceApplication" está en "
com.service.something
", luego se
com.service.something
todos los componentes que se encuentran en "
com.service.something
" y no se escaneará "
com.service.applicant
".
Puede reestructurar sus paquetes de modo que "WebServiceApplication" se encuentre en un paquete raíz y todos los demás componentes se conviertan en 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 gestionados por maven / gradle, todas las necesidades de primavera son 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.
"
com.module2.
Hay una posibilidad ...
Es posible que le falte la anotación
@Service
,
@Repository
en sus respectivas clases de implementación.
@SpringBootApplication
@MapperScan("com.developer.project.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}