java - 无法解决匹配的构造函数 - 重写 BaseRepository 类

标签 java spring spring-repositories

我收到无法解决扩展 BaseRepository 的接口(interface)和类中的匹配构造函数错误。我已将代码回滚到仅重写 BaseRepository 类的方法的位置,但仍然无法确定原因。

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

我在网上看到的解决方案特定于设置方法的构造函数参数值,但我没有为 UserPasswordResetToken 类使用 xml 或 java 配置。如果我为它做了一个 bean 配置,我不知道在哪里声明 constructor-arg 值。我可以对所有这些进行编码,但这并不能帮助我了解问题的原因并了解它。我也没有看到哪里有两个同名的方法来迷惑 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接口(interface):

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

}

最佳答案

等等...我自己都感到困惑。我刚刚重读了堆栈跟踪。我正在研究 IUserPasswordTokenRepository 类,但堆栈跟踪现在显示为 IUserVerificationTokenRepositoryClass。我修复了PasswordToken类,但没有注意到它!

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

感谢您的浏览!

关于java - 无法解决匹配的构造函数 - 重写 BaseRepository 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43236286/

相关文章:

java - Jar 文件附加到末尾时不会添加到 java 类路径

java - Java 中的 NullPointerException 与继承

java - 单击通知不会打开提到的 Activity

java - 为什么 Tomcat 在 mvn clean install 后需要清理多个服务器?

spring - java.lang.IllegalArgumentException : 'sessionFactory' or 'hibernateTemplate' is required in spring+hibernate

spring-data-jpa - 通过集合中的精确匹配查找实体

mysql - Spring JpaRepository findBy...In(Collection) 返回并集而不是交集

java - 如何使用Spring事务管理将当前用户更新到数据库?

java - 一个 web.xml 中的多个 Jersey servlet