Я нашел проблему и нашел решение, поэтому хочу поделиться ею с вами.Проблема была в компонентном сканировании Spring Framework, и вот мое решение:
XML:
<context:component-scan base-package="com.example">
<context:exclude-filter type="aspectj" expression="com.example.beans.*" />
</context:component-scan>
Аннотация:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.example" },
excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.beans.*"))
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Вторая проблема - о бобе Springинъекция в компонент CDI, поэтому я создаю мост между Spring и CDI.
Мне нужно создать новую аннотацию, подобную этой:
@Qualifier
@Inherited
@Documented
@Retention(RUNTIME)
@Target({ FIELD, TYPE, METHOD, PARAMETER })
public @interface SpringBean {
String value() default "";
}
и продюсер:
@SessionScoped
public class CdiBeanFactoryPostProcessor implements Serializable {
private static final long serialVersionUID = -44416514616012281L;
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{msg}", PropertyResourceBundle.class);
}
@Produces
@SpringBean("example")
public Example example(InjectionPoint injectionPoint) {
return (Example) findBean(injectionPoint);
}
protected Object findBean(InjectionPoint injectionPoint) {
Annotated annotated = injectionPoint.getAnnotated();
SpringBean springBeanAnnotation = annotated.getAnnotation(SpringBean.class);
ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
String name = springBeanAnnotation.value();
if(StringUtils.isNotBlank(name))
return WebApplicationContextUtils.getRequiredWebApplicationContext(ctx).getBean(name);
else
throw new NoSuchBeanDefinitionException(name, "not found in Context");
}
}
И я внедряю ее в свой боб так:
@Named
@SessionScoped
public class ExampleBean extends AbstractManagedBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = LogManager.getLogger(ExampleBean.class);
@Inject
@SpringBean("example")
protected transient Example example;
@Inject
protected transient PropertyResourceBundle bundle;
..................
}
спасибо!