2017-04-05 2 views
1

Je reçois l'erreur Impossible de résoudre l'erreur de constructeur dans une interface et une classe qui étend BaseRepository. J'ai renvoyé le code à l'endroit où je remplace seulement les méthodes de la classe BaseRepository et ne peux toujours pas déterminer la cause.Impossible de résoudre le constructeur correspondant - redéfinissant BaseRepository Classe

Habituellement, il est causé par quelque chose comme deux méthodes ayant le même nom et le printemps en choisissant le mauvais, mais je ne vois pas cela se produire. Les méthodes de UserPasswordResetToken ont été générées par l'IDE Eclipse. J'ai sélectionné toutes les classes à implémenter dans la boîte de dialogue Clic droit-> source-> Remplacer/implémenter les méthodes.

Les solutions que j'ai vues en ligne sont spécifiques à la définition de la valeur constructeur-arg des méthodes, mais je n'utilise pas de configuration xml ou java pour la classe UserPasswordResetToken. Je ne sais pas où déclarer les valeurs de constructeur-arg si je fais une configuration de bean pour cela. Je pourrais simplement les coder tous, mais cela ne m'aide pas à voir la cause du problème et à en apprendre davantage. Je ne vois pas non plus où j'ai deux méthodes avec le même nom pour confondre Spring.

Je suis de ceux qui veulent non seulement la réponse mais aussi un moyen d'éviter cela dans le futur. Toute suggestion le long de cette ligne serait utile. Un message d'erreur révisé indiquant quelle méthode est à l'origine du problème serait également une amélioration. Je suppose que j'ai une suggestion pour les gens d'Oracle.

Trace de la pile:

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 

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

} 

Interface 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 Classe:

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 Classe

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

Pouvez-vous me dire d'où vient la BaseRepository.class, ou est-ce votre implémentation? Si c'est votre implémentation, veuillez poster le code. –

+0

Ah, bon point. Le code est publié. Il étend le springframework. classe data.repository. Alors oui, j'ai des interfaces qui étendent les interfaces. –

Répondre

0

MAINTIEN ... Je me confonds. Je viens de relire la trace de la pile. Je travaillais sur la classe IUserPasswordTokenRepository mais la trace de pile lit maintenant IUserVerificationTokenRepositoryClass. J'ai corrigé la classe PasswordToken et je ne l'ai pas remarqué!

J'avais auparavant deux méthodes pour supprimer, une avec chaîne et un paramètre de jeton. J'ai supprimé le String et tout rediffusé. Je n'ai pas remarqué que le nom de la classe avait changé dans la trace de la pile car ils sont nommés de la même manière. J'ai donc vu le problème après tout.

Merci de votre visite!