web-dev-qa-db-fra.com

Câblage automatique: attendu au moins 1 bean qui se qualifie comme candidat au câblage automatique pour cette dépendance

D'accord, je sais qu'il y a beaucoup de questions posées autour du même sujet. Mais je n'arrive pas à faire fonctionner quoi que ce soit. Il se peut également que je ne comprenne pas encore complètement le concept de câblage automatique. Mon problème: je peux accéder à la page requise, mais chaque fois que je clique sur n'importe quel bouton pour effectuer une action, j'obtiens une exception de pointeur Null, ce qui semble évident car je ne pense pas que Spring soit capable de mapper correctement le bean nécessaire.

Ainsi, lorsque j'ajoute @ autowired = true, cela me donne l'exception donnée ci-dessus. Je ne suis pas sûr de ce qui doit être fait. J'espère que quelqu'un pourra m'aider. J'adorerais aussi avoir une explication :) Code:

@Entity
@Table(name="userDetails")
public class UserDetailModel {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int user_id;
public String password;
public String user_name;
public String active_status;

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getUser_name() {
    return user_name;
}

public void setUser_name(String user_name) {
    this.user_name = user_name;
}

public int getUser_id() {
    return user_id;
}

public void setUser_id(int user_id) {
    this.user_id = user_id;
}

public String getActive_status() {
    return active_status;
}

public void setActive_status(String active_status) {
    this.active_status = active_status;
}

}

Manette:

@RestController
public class UserDetailController {

 private Logger logger = (Logger) LoggerFactory.getLogger(UserDetailController.class);
 @Autowired(required = true)
private UserRepository userRepository;

@RequestMapping(value="/login", method = RequestMethod.POST)
public @ResponseBody String addNewUser (@RequestBody UserDetailModel user) {
    // @ResponseBody means the returned String is the response, not a view name
    // @RequestParam means it is a parameter from the GET or POST request

    logger.debug("in controller");
    UserDetailModel userDtl = new UserDetailModel();
    userDtl.setUser_id(user.user_id);
    userDtl.setUser_name(user.user_name);
    userDtl.setActive_status(user.active_status);
    userDtl.setPassword(user.password);

    userRepository.save(userDtl);
    return "Saved";
}

}

Dépôt:

@Repository
public interface UserRepository extends CrudRepository<UserDetailModel,         Long> {}

Trace de la pile:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.springBoot.usl.repo.UserRepository com.springBoot.usl.controller.UserDetailController.userRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.springBoot.usl.repo.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:482)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:120)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:683)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:944)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:933)
at com.springBoot.usl.controller.WebAppInitializer.main(WebAppInitializer.Java:18)

Résolu sur la base des réponsesRéponse: J'ai fait quelques modifications basées sur les réponses de Jay et Luay. Et changé les annotations comme suit dans mon fichier ApplicationConfig:

@Configuration
@ComponentScan("my.basepackage.*")
@EnableJpaRepositories(basePackages = {"my.basepackage.*"})
@EntityScan("my.basepackage.*")
@EnableAutoConfiguration

J'espère que cela aide quelqu'un.

Mais je ne sais pas si * est la bonne voie à suivre.

6
User-8017771

Je suis capable d'exécuter votre application avec quelques modifications côté annotation.

J'ai utilisé les mêmes classes qui sont données en question. Veuillez voir ci-dessous la structure et la configuration utilisées. Structure du répertoire

J'ai utilisé des packages comme ci-dessous et ajouté vos classes,
com.rcmutha.usl.controller
com.rcmutha.usl.repository

@SpringBootApplication
@ComponentScan({"com.rcmutha*"})
@EntityScan("com.rcmutha*")
@EnableJpaRepositories("com.rcmutha*")
public class Application {

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

Pour le code complet: cliquez ici pour le code

7

Je pense que votre application n'est pas en mesure d'analyser la classe UserRepository. Si vous utilisez Spring Boot, vous devez placer la classe principale au-dessus de la hiérarchie de vos packages.

Vous devez également utiliser @EnableJpaRepositories Et lui indiquer le package de base de votre référentiel pour activer la fonctionnalité de référentiel

@EnableJpaRepositories(basePackages ={"com.springBoot.usl.repo"})

1
Naresh Joshi

Vous devez activer les référentiels JPA dans votre classe de configuration, spécifiez le package qui contient les référentiels comme ci-dessous

@Configuration
@EnableJpaRepositories(basePackages = {
    "com.springBoot.usl.repo"
})
public class ApplicationConfig {

}

Exemple d'ApplicationConfig:

@Configuration
@EnableJpaRepositories(basePackages = {"com.springBoot.usl.repo"})
@EnableTransactionManagement
public class ApplicationConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/xxxx");
        dataSource.setUsername("xxxx");
        dataSource.setPassword("xxxx");

        return dataSource;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("xx.xxxx.xxxx.xxxx.domain");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();
        return factory.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }
0
Jay Smith

UserRepository n'est tout simplement pas défini dans le contexte Spring actuel. Assurez-vous que votre classe est définie dans un package analysé par Spring. Vous devrez utiliser @ComponentScan("org.my.pkg") dans votre classe de configuration pour que Spring analyse le package.

Si vous utilisez Spring Boot, assurez-vous de localiser votre classe d'application principale qui est annotée avec @SpringBootApplication dans un package racine au-dessus des autres classes, car il contient @ComponentScan.

0
Luay Abdulraheem