2017-08-01 137 views
0

我試圖執行「忘記密碼」字段使用彈簧安全。但是我嘗試解決了一個錯誤,但找不到解決方案。我知道JpaRepository做了一些批處理和CRUD操作。我的user.java模型類包含所有字段(.... email,resetToken)。忘記密碼實現彈簧安全

UserRepositoryDao:

@Repository("userRepository") 
public interface UserRepositoryForgetPassword extends JpaRepository<User, Long>{ 

    Optional<User> findByEmail(String email); 
    Optional<User> findByResetToken(String resetToken); 

} 

UserServiceForgotPassword:

public interface UserServiceForgetPassword { 

    public Optional<User> findUserByEmail(String email); 

    public Optional<User> findUserByResetToken(String resetToken); 

    public void save(User user); 
} 

UserServiceForgotPasswordImpl:

@Service("userServiceForgetPassword") 
public class UserServiceForgetPasswordImpl implements UserServiceForgetPassword { 

    @Autowired 
    UserRepositoryForgetPassword userRepositoryForgetPassword; 

    @Override 
    @Transactional 
    public Optional<User> findUserByEmail(String email) { 
     return userRepositoryForgetPassword.findByEmail(email); 
    } 

    @Override 
    @Transactional 
    public Optional<User> findUserByResetToken(String resetToken) { 
     return userRepositoryForgetPassword.findByResetToken(resetToken); 
    } 

    @Override 
    @Transactional 
    public void save(User user) { 
     userRepositoryForgetPassword.save(user); 
    } 
} 

錯誤:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'fogetPasswordController': Unsatisfied dependency expressed through field 'userServiceForgetPassword'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceForgetPassword': Unsatisfied dependency expressed through field 'userRepositoryForgetPassword'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.pulseBeatMaster.dao.UserRepositoryForgetPassword' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

控制器:

@RestController 
    public class FogetPasswordController { 

     @Autowired 
     UserServiceForgetPassword userServiceForgetPassword; 

     @Autowired 
     EmailServiceForgetPassword emailServiceForgetPassword; 

     @Autowired 
     private BCryptPasswordEncoder bCryptPasswordEncoder; 


     //Do the stuffs 

} 

我希望有延伸JpaRepository錯誤。

EDITED

@Configuration 
@PropertySource(value = { "classpath:application.properties" }) 
public class ApplicationContextConfig { 

    // To get properties from application.properties 
    // Import @PropertySource(value = { "classpath:application.properties" }) 
    // Have to use environment.getRequiredProperty(); 

    @Autowired 
    private Environment environment; 

    @Bean(name = "dataSource") 
    public DataSource getDataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 

     // normally 
     // dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 

     return dataSource; 
    } 

    private Properties getHibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     properties.put("hibernate.id.new_generator_mappings", 
       environment.getRequiredProperty("hibernate.new_generator_mappings")); 
     properties.put("current_session_context_class", "org.springframework.orm.hibernate5.SpringSessionContext"); 
     return properties; 
    } 

    @Autowired 
    @Bean(name = "sessionFactory") 
    public SessionFactory getSessionFactory(DataSource dataSource) { 
     LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource); 
     sessionBuilder.addProperties(getHibernateProperties()); 
     sessionBuilder.addAnnotatedClasses(Employee.class); 
     sessionBuilder.addAnnotatedClasses(Department.class); 
     sessionBuilder.addAnnotatedClasses(Company.class); 
     sessionBuilder.addAnnotatedClasses(User.class); 
     sessionBuilder.addAnnotatedClasses(UserProfile.class); 
     sessionBuilder.addAnnotatedClasses(UserProfileType.class); 
     sessionBuilder.addAnnotatedClasses(PersistentLogin.class); 
     sessionBuilder.addAnnotatedClasses(GaugeCategory.class); 
     sessionBuilder.addAnnotatedClasses(Survey.class); 
     sessionBuilder.addAnnotatedClasses(PreferredUrl.class); 
     sessionBuilder.addAnnotatedClasses(Gauge.class); 
     sessionBuilder.addAnnotatedClasses(GaugeFeedback.class); 
     sessionBuilder.addAnnotatedClasses(Customer.class); 
     sessionBuilder.addAnnotatedClasses(Phone.class); 
     return sessionBuilder.buildSessionFactory(); 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(getDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.pulseBeatMaster.model" }); 
     sessionFactory.setHibernateProperties(getHibernateProperties()); 
     return sessionFactory; 
    } 

    @Autowired 
    @Bean(name = "transactionManager") 
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory); 
     return transactionManager; 
    } 

    @Bean 
    public JavaMailSender getMailSender() { 
     JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 

     // Using gmail 
     mailSender.setHost(environment.getRequiredProperty("mailSender.host")); 
     mailSender.setPort(587); 
     mailSender.setUsername(environment.getRequiredProperty("mailSender.username")); 
     mailSender.setPassword(environment.getRequiredProperty("mailSender.password")); 

     Properties javaMailProperties = new Properties(); 
     javaMailProperties.put("mail.smtp.starttls.enable", "true"); 

     javaMailProperties.put("mail.smtp.auth", "true"); 
     javaMailProperties.put("mail.transport.protocol", "smtp"); 
     javaMailProperties.put("mail.debug", "true");// Prints out everything on 
                 // screen 

     mailSender.setJavaMailProperties(javaMailProperties); 
     return mailSender; 
    } 

} 
+0

它看起來像你通常沒有得到你的存儲庫接口掃描。我們需要查看你的JPA/Spring Data配置。 – chrylis

+0

@chrylis我注入了** spring-boot-starter-data-jpa **依賴關係,並繼續僅在編碼之上。 – varman

+0

顯示你的配置類 –

回答

-4

您需要在UserRepositoryForgetPassword接口上使用@Repository。並在您的ApplicationContaxt.xml文件配置中添加@EnableJpaRepositories(basePackages = {"com.demo.test.repository"})以掃描存儲庫類,並在ApplicationContaxt.xml文件中使用<context:component-scan annotation-config="true" base-package="com.demo.test" />來掃描基本包和類註釋。

+0

他正在使用Spring Boot,它在檢測到時自動啓用Spring Data JPA。您不需要明確啓用它。也不需要在接口中添加@Repository。也是一個XML文件中的註釋?你如何看待這種情況? –

1

你需要

  • 通過與@EnableJpaRepositories註解該ApplicationContextConfig類啓用春季數據JPA。
  • 配置在Spring Data JPA爲我們的存儲庫接口創建實現時掃描的base packages

所以,請添加您的配置文件(ApplicationContextConfig):

@EnableJpaRepositories(basePackages = {"com.pulseBeatMaster.dao"}) 
0

請檢查下面的配置類。正如M. Denium所建議的,您不必直接使用SessionFactory。 JPA工作在EntityManager的概念上。我已經做了必要的更改,使其通過java配置工作。如果您使用的是spring-boot,則可以使用application.properties完成大部分此配置。

@Configuration 
    @PropertySource(value = { "classpath:application.properties" }) 
    @EnableJpaRepositories(basePackages = "com.pulseBeatMaster.dao", entityManagerFactoryRef = "myEntityManagerFactory", transactionManagerRef = "myTransactionManager") 
    public class ApplicationContextConfig { 

     // To get properties from application.properties 
     // Import @PropertySource(value = { "classpath:application.properties" }) 
     // Have to use environment.getRequiredProperty(); 

     @Autowired 
     private Environment environment; 

     @Bean(name = "dataSource") 
     public DataSource getDataSource() { 
      BasicDataSource dataSource = new BasicDataSource(); 
      dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
      dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
      dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
      dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 

      // normally 
      // dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 

      return dataSource; 
     } 

     private Properties getHibernateProperties() { 
      Properties properties = new Properties(); 
      properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
      properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
      properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
      properties.put("hibernate.id.new_generator_mappings", 
        environment.getRequiredProperty("hibernate.new_generator_mappings")); 
      properties.put("current_session_context_class", "org.springframework.orm.hibernate5.SpringSessionContext"); 
      return properties; 
     } 

     @Autowired 
     @Bean(name = "transactionManager") 
     public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) { 
      HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory); 
      return transactionManager; 
     } 

     @Primary 
     @Bean(name="myEntityManagerFactory") 
     public LocalContainerEntityManagerFactoryBean myEntityManagerFactory() throws ClassNotFoundException { 
      final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 

      entityManagerFactoryBean.setDataSource(getDataSource()); 
      // mention packae scan your classes annotated as @Entity 
      entityManagerFactoryBean.setPackagesToScan(new String[] { "com.pulseBeatMaster.model" }); 
      entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 

      final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
      vendorAdapter.setShowSql(true); 
      entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter); 
      entityManagerFactoryBean.setJpaProperties(getHibernateProperties()); 

      entityManagerFactoryBean.afterPropertiesSet(); 
      entityManagerFactoryBean.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver()); 

      return entityManagerFactoryBean; 
     } 

     @Primary 
     @Bean(name = "myTransactionManager") 
     public PlatformTransactionManager myTransactionManager() { 
      final JpaTransactionManager transactionManager = new JpaTransactionManager(); 
      try { 
       transactionManager.setEntityManagerFactory(myEntityManagerFactory().getObject()); 
       transactionManager.setDataSource(getDataSource()); 
       transactionManager.setJpaDialect(new HibernateJpaDialect()); 
       transactionManager.setJpaProperties(getHibernateProperties()); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
      return transactionManager; 
     } 

     @Bean 
     public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { 
      return new PersistenceExceptionTranslationPostProcessor(); 
     } 

     @Bean 
     public HibernateExceptionTranslator hibernateExceptionTranslator() { 
      return new HibernateExceptionTranslator(); 
     } 

     @Bean 
     public JavaMailSender getMailSender() { 
      JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 

      // Using gmail 
      mailSender.setHost(environment.getRequiredProperty("mailSender.host")); 
      mailSender.setPort(587); 
      mailSender.setUsername(environment.getRequiredProperty("mailSender.username")); 
      mailSender.setPassword(environment.getRequiredProperty("mailSender.password")); 

      Properties javaMailProperties = new Properties(); 
      javaMailProperties.put("mail.smtp.starttls.enable", "true"); 

      javaMailProperties.put("mail.smtp.auth", "true"); 
      javaMailProperties.put("mail.transport.protocol", "smtp"); 
      javaMailProperties.put("mail.debug", "true");// Prints out everything on 
                  // screen 

      mailSender.setJavaMailProperties(javaMailProperties); 
      return mailSender; 
     } 

    } 

經由彈簧引導屬性最小的配置只需要檢查這個spring-boot-jpa 教程。