Метод производителя CDI не работает, если определяющий класс не объявляет область

Я запускаю некоторое доказательство концепции в локальной установке Glassfish 4.1.1 (WELD 2.2.2) о CDI.

Я создал bean-компонент класса с именем TipicalBean, который вводит целое число, полученное в методе производителя.

Класс, определяющий метод производителя, выглядит так

public class ProducerTest {

    @Produces @MyNumber @Dependent public static int getMyNumber() {
        return 100;
    }
}

Это не работает. Даже если я объявлю метод static

Но это работает, если поместить область @Dependent в определение класса, например:

@Dependent
public class ProducerTest {

Кроме того, если я объявляю этот метод производителя в том же классе, который его внедряет, я могу определить область @Dependent в объявлении метода производителя, но WELD выводит предупреждение в консоли Glassfish.

WELD-000018: Executing producer field or method [BackedAnnotatedMethod] @Produces
@MyNumber @Dependent public mypackage.TipicalBean.produceMyNumber() on incomplete
declaring bean Managed Bean [class mypackage.TipicalBean] with qualifiers [@Any
@Default] due to circular injection

Почему это? Это методы производителя должны быть определены в ManagedBeans?

Поскольку я использую JavaEE 7, я не создал файл beans.xml.

Спасибо


person daschapa    schedule 23.11.2015    source источник
comment
Пожалуйста, опубликуйте свой beans.xml, возможно, вам не хватает bean-discovery-mode="all".   -  person Alexander Langer    schedule 23.11.2015
comment
Я не создавал файл beans.xml, так как использую CDI 1.1. Я не нашел в документации никаких ссылок на такое поведение в отношении методов производителя. Спасибо   -  person daschapa    schedule 23.11.2015


Ответы (1)


Из спецификации CDI:

Метод производителя должен быть общедоступным, защищенным или закрытым, неабстрактным методом класса управляемого компонента или класса сеансового компонента с доступом по умолчанию.

person Harald Wellmann    schedule 23.11.2015
comment
И чтобы уточнить, ваш класс не был зарегистрирован как управляемый bean-компонент, потому что отсутствие beans.xml поместило вашу среду в bean-discovery-mode=annotated и ваши аннотации, определяющие bean-компоненты, не имели ничего общего с областью действия (хотя области действия - это аннотация, определяющая bean-компонент) - person John Ament; 24.11.2015