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);
}
}