2017-04-05 127 views
1

我得到无法解决匹配构造函数错误的接口和类扩展BaseRepository。我已经将代码回滚到了我只覆盖BaseRepository类的方法的位置,但仍然无法确定原因。无法解决匹配的构造函数 - 覆盖BaseRepository类

通常它是由两个具有相同名称的方法和Spring选择错误的东西引起的,但我没有看到发生这种情况。 UserPasswordResetToken中的方法由Eclipse IDE生成。我在右键单击 - >源 - >覆盖/实现方法对话框中选择要实现的所有类。

我在网上看到的解决方案具体在设置方法的构造函数参数值,但我没有为UserPasswordResetToken类使用xml或java配置。我不知道在哪里声明构造函数的参数值,如果我为它做一个bean配置。我可以编写所有这些代码,但这并不能帮助我查看问题的原因并了解它。我也没有看到我有两个同名的方法来混淆Spring。

我是那些不仅希望得到答案的人,也是未来避免这种情况的方法之一。这条线上的任何建议都会有所帮助。修正的错误信息说明哪种方法导致问题也是一种改进。猜猜我对Oracle的人有一个建议。

堆栈跟踪:

Caused by: java.lang.RuntimeException: 
org.springframework.beans.factory.UnsatisfiedDependencyExcep 
tion: Error creating bean with name 'persistenceJPAConfig': 
Unsatisfied dependency expressed through field 'env'; nested 
exception is 
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 
'IUserVerificationTokenRepository': Could not resolve 
matching constructor (hint: specify index/type/name 
arguments for simple parameters to avoid type ambiguities) 
     at 
io.undertow.servlet.core.DeploymentManagerImpl.deploy(Deploy 
mentManagerImpl.java:236) 
     at 
org.wildfly.extension.undertow.deployment.UndertowDeployment 
Service.startContext(UndertowDeploymentService.java:100) 
     at 
org.wildfly.extension.undertow.deployment.UndertowDeployment 
Service$1.run(UndertowDeploymentService.java:82) 
     ... 6 more 

PersistenceJPAConfiguration类:

@Configuration 
@EnableTransactionManagement 
@PropertySource({ "classpath:persistence-mysql.properties" }) 
@ComponentScan(basePackages = {"com.aexample.persistence"}, 
    includeFilters = @Filter(type = FilterType.REGEX, pattern="com.aexample.persistence.*")) 
@EnableJpaRepositories(basePackages = "com.aexample.persistence.repositories") 
//@EnableJpaAuditing(dateTimeProviderRef = "dateTimeProvider") 
public class PersistenceJPAConfig { 

    @Autowired 
    private Environment env; 

    public PersistenceJPAConfig() { 
     super(); 
    } 

    // beans 
    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan(new String[] { "com.aexample.persistence.model" }); 

     final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 

     return em; 
    } 

    @Bean(name="dataSource") 
    public DataSource dataSource() { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); 
     dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); 
     dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); 
     dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); 

     return dataSource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) { 
     final JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 
     return transactionManager; 
    } 

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

    @Bean 
    public BCryptPasswordEncoder passwordEncoder(){ 
     return new BCryptPasswordEncoder(); 
    } 

    @Bean 
    public SessionRegistry sessionRegistry(){ 
     return new SessionRegistryImpl(); 
    } 

    final Properties additionalProperties() { 
     final Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); 
     hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); 
     // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); 
     return hibernateProperties; 
    } 

} 

IUserPasswordResetToken接口:

public interface IUserPasswordResetTokenRepository extends BaseRepository<UserPasswordResetToken, Long> { 


    void delete(UserPasswordResetToken token); 

    public List<UserPasswordResetToken> findAll(); 

    public UserPasswordResetToken findOne(Long id); 

    public UserPasswordResetToken save(UserPasswordResetToken persisted); 

    UserPasswordResetToken findByToken(String token); 

    UserPasswordResetToken findByUser(User user); 

    Stream<UserPasswordResetToken> findAllByExpiryDateLessThan(Date now); 

    void deleteByExpiryDateLessThan(Date now); 

    @Modifying 
    @Query("delete from UserPasswordResetToken t where t.expiryDate <= ?1") 
    void deleteAllExpiredSince(Date now); 
} 

UserPasswordResetToken类别:

public abstract class UserPasswordResetTokenRepositoryImpl implements IUserPasswordResetTokenRepository { 

    private IUserPasswordResetTokenRepository repository; 


    /** 
    * @param repository 
    */ 
    public UserPasswordResetTokenRepositoryImpl(IUserPasswordResetTokenRepository repository) { 
     super(); 
     this.repository = repository; 
    } 

    @Override 
    public void delete(UserPasswordResetToken deleted) { 

     repository.delete(deleted); 

    } 

    @Override 
    public List<UserPasswordResetToken> findAll() { 

     List<UserPasswordResetToken> theTokens = repository.findAll(); 

     return theTokens; 
    } 

    @Override 
    public UserPasswordResetToken findOne(Long id) { 

     UserPasswordResetToken theToken = repository.findOne(id); 

     return theToken; 
    } 

    @Override 
    public UserPasswordResetToken save(UserPasswordResetToken persisted) { 

     UserPasswordResetToken theToken = repository.save(persisted); 

     return theToken; 

    } 

    @Override 
    public UserPasswordResetToken findByToken(String token) { 

     UserPasswordResetToken theToken = repository.findByToken(token); 

     return theToken; 
    } 

    @Override 
    public Stream<UserPasswordResetToken> findAllByExpiryDateLessThan(Date now) { 

     Stream<UserPasswordResetToken> theTokenStream = repository.findAllByExpiryDateLessThan(now); 

     return theTokenStream; 

    } 

    @Override 
    public UserPasswordResetToken findByUser(User user) { 

     UserPasswordResetToken theToken = repository.findByUser(user); 

     return theToken; 
    } 

    @Override 
    public void deleteByExpiryDateLessThan(Date now) { 

     repository.deleteByExpiryDateLessThan(now); 

    } 

    @Override 
    public void deleteAllExpiredSince(Date now) { 

     repository.deleteAllExpiredSince(now); 

    } 

} 

BaseRepository类

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.repository.NoRepositoryBean; 
import org.springframework.data.repository.Repository; 


@NoRepositoryBean 
public interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID>{ 

    void delete(T deleted); 

    List<T> findAll(); 

    T findOne(ID id); 

    T save(T persisted);  

} 
+0

你能告诉我BaseRepository.class来自哪里,还是你的实现。如果这是您的实施,请发布代码。 –

+0

啊,好点。代码已发布。它延伸了弹簧框架。 data.repository类。所以是的,我有接口扩展接口。 –

回答

0

HOLD ON ......我迷惑自己。我只是重读堆栈跟踪。我正在研究IUserPasswordTokenRepository类,但堆栈跟踪现在读取的内容为IUserVerificationTokenRepositoryClass。我修复了PasswordToken类并没有注意到它!

我以前有两种删除方法,一种是字符串和一种令牌参数。我删除了一个字符串并重新运行一切。我没有注意到堆栈跟踪中的类名已更改,因为它们的名称相似。所以我确实看到了这个问题。

感谢您的期待!