【发布时间】:2019-07-08 16:14:30
【问题描述】:
我正在尝试为实体类编写自定义 JSF 转换器。 我在我的项目中使用了 spring-data 和 spring-boot。
知道我有很多类看起来像`this:
@Component("myFirstConverter")
class MyFirstConverter implements Converter {
@Autowired
private MyFirstRepository myFirstRepository;
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
return myFirstRepository.findOne(Long.parseLong(value));
}
//...
}
我创建了自定义类 EntityConverter。它适用于 CrudRepository。但我不明白如何以编程方式创建 bean 数组并注入到每个 bean 对应的存储库中。
知道我试图用这段代码编写 @Configuration 类:
@Configuration
class MyConfig extends WebMvcConfigurerAdapter
@Bean
public static BeanFactoryPostProcessor registerConverters(ApplicationContext context) {
Map<String, Class<? extends CrudRepository>> converterBeans = new HashMap<>();
converterBeans.put("firstEntity", firstEntityRepository.class);
converterBeans.put("secondEntity", secondEntity.class);
return factory -> {
for (val entry : converterBeans.entrySet()) {
CrudRepository bean = context.getBean(entry.getValue()
factory.registerSingleton(entry.getKey()
.concat("Converter"), new EntityConverter(
entry.getKey(), bean));
}
};
但它不起作用。应用程序初始化失败。
19:07:59.546 [WARN ] o.s.c.support.AbstractApplicationContext:551 -
Exception encountered during context initialization - cancelling
refresh attempt:
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'myFirstRepository': Cannot create inner bean
'(inner bean)#1fdfafd2' of type
[org.springframework.orm.jpa.SharedEntityManagerCreator] while setting
bean property 'entityManager'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name '(inner bean)#1fdfafd2': Cannot resolve
reference to bean 'entityManagerFactory' while setting constructor
argument; nested exception is
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$fe46103]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$fe46103.<init>()Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fumoRepository': Cannot create inner bean '(inner bean)#1fdfafd2' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1fdfafd2': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$fe46103]: No default constructor found; nested exception is java.lang.NoSuchMethodException:
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurati
on$$EnhancerBySpringCGLIB$$fe46103.<init>()
UPD:
Answer WiPU 允许解决问题。我像这样更改了我的 registerConverters 方法:
@Configuration
class MyConfig extends WebMvcConfigurerAdapter
@Bean
public static BeanFactoryPostProcessor
registerConverters(ApplicationContext context) {
Map<String, Class<? extends CrudRepository>> converterBeans = new HashMap<>();
converterBeans.put("firstEntity", firstEntityRepository.class);
converterBeans.put("secondEntity", secondEntity.class);
return factory -> {
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry)
factory;
for (val entry : converterBeans.entrySet()) {
BeanDefinitionBuilder b =
BeanDefinitionBuilder.genericBeanDefinition(EntityConverter.class)
.addPropertyReference("repository", entry.getKey().concat("Repository"))
;
beanFactory.registerBeanDefinition(entry.getKey().concat("Converter"), b.getBeanDefinition());
factory.registerSingleton(entry.getKey()
.concat("Converter"), new EntityConverter(
entry.getKey(), bean));
}
};
【问题讨论】:
-
如果要进行注入的 claas 不是 jsf 转换器,那么您可以让它工作吗?
标签: spring spring-boot