【问题标题】:How to inject Class<T> as bean?如何将 Class<T> 作为 bean 注入?
【发布时间】:2017-01-02 07:42:51
【问题描述】:

我有以下类 UserAuthorityRepository 作为存储库:

@Repository
public class UserAuthorityRepository extends BaseRepository<UserAuthority, Long> implements IUserAuthorityRepository {

public UserAuthorityRepository(Class<UserAuthority> domainClass, EntityManager em) {
  super(domainClass, em);
}

}

UserAuthorityService 我有:

@Service
public class UserAuthorityService extends BaseService<UserAuthority, Long> implements IUserAuthorityService {

private static final Logger LOGGER = LoggerFactory.getLogger(UserAuthorityService.class);

@Autowired
private IUserAuthorityRepository userAuthorityRepo;

public UserAuthorityService() {
  super();
  LOGGER.info("UserAuthorityService Has Been Created");
}

@Bean
@Override
public Class<UserAuthority> getDomain() {
  return UserAuthority.class;
}

@Override
public IBaseRepository<UserAuthority, Long> getRepository() {
  return userAuthorityRepo;
}

}

但我的应用程序在启动时出现异常如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.bia2hd.dao.impl.UserAuthorityRepository required a bean of type 'java.lang.Class' that could not be found.


Action:

Consider defining a bean of type 'java.lang.Class' in your configuration.

【问题讨论】:

  • @JoeC 谢谢,但是我没有xml配置,都是注解。
  • 这里可能是个愚蠢的问题......但是为什么你需要在这种情况下注入Class?你的构造函数参数的唯一合法值是UserAuthority.class,那么为什么不在你的超构造函数调用中显式设置它而不是依赖它被注入(然后只需要注入EntityManager)?
  • 尽管您对这里的整个愚蠢问题有什么看法,但问题更复杂。有十几个存储库出现这种情况。
  • 请看我的另一篇文章

标签: java spring spring-boot spring-data


【解决方案1】:

我刚刚解决了它(不是很愉快,但工作)。

@Configuration
public class Beans {

   @Autowired
   private ApplicationContext applicationContext;

   @PostConstruct
   public void createClassBeans() throws ClassNotFoundException {

      ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);

      scanner.addIncludeFilter(new AnnotationTypeFilter(Entity.class));

      ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext)
            .getBeanFactory();

      for (BeanDefinition bd : scanner.findCandidateComponents("my.package")) {
         Class<?> bean = Class.forName(bd.getBeanClassName());
         beanFactory.registerSingleton(bean.getName(), bean);
      }

   }

}

@Repository
public class UserRepository extends BaseRepository<User, Long> implements IUserRepository {

   UserRepository(@Qualifier("my.package.User") Class<User> domainClass, EntityManager em) {
      super(domainClass, em);
   }

}

【讨论】:

    【解决方案2】:

    您是否尝试过使用@Configuration

    @Configuration
    public class InjectConfiguration {
    
        @Bean("providerEmployeeContext")
        @RequestScope
        public IEmployeeContext<Employee> providerEmployeeConfiguration() {
    
            return new EmployeeContext<>(sessionFactory(), Employee.class);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 2011-10-28
      • 2013-06-25
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2019-08-04
      • 2017-12-12
      相关资源
      最近更新 更多