CDI bean-компонент Primefaces graphicimage не работает

у меня была проблема с отображением изображений, полученных моей БД.

Просмотр вызывающего абонента:

<p:graphicImage value="#{appController.image}" height="200 px" >
      <f:param name="oid" value="#{item.oid}" />
</p:graphicImage>

Контроллер:

@Named("appController")
@ApplicationScoped
public class AppController {

    @Inject
    private MultimediaFacade multimediaFacade;

    public StreamedContent getImage() throws IOException {
        System.out.println("getting image")
        FacesContext context = FacesContext.getCurrentInstance();
        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        } else {
            // So, browser is requesting the image. Return a real StreamedContent with the image bytes.
            String imageId = context.getExternalContext().getRequestParameterMap().get("oid");
            int oid=Integer.parseInt(imageId);
            System.out.println(oid);
            Multimedia image = multimediaFacade.find(oid);
            System.out.println(Arrays.toString(image.getFileBlob()));
            return new DefaultStreamedContent(new ByteArrayInputStream(image.getFileBlob()));
        }
    }
}

этот код ничего не показывает, и похоже, что метод никогда не вызывается (никогда не печатается в консоли)!

после нескольких дней пробного изменения области я попытался использовать @ManagedBean вместо @Named, и это работает !!!

может кто-нибудь объяснить мне, почему это работает только с @ManagedBean, а не с @Named?


person Marco    schedule 19.05.2016    source источник
comment
javax.enterprise.context.ApplicationScoped для CDI, javax.faces.bean.ApplicationScoped для JSF.   -  person Geinmachi    schedule 19.05.2016
comment
это не проблема масштаба   -  person Marco    schedule 20.05.2016
comment
Вы хотите сказать, что компоненты CDI нормально работают на обычных страницах?   -  person BalusC    schedule 20.05.2016
comment
@BalusC, что ты имеешь в виду под обычным? У меня есть компонент ViewScoped CDI, который отлично работает. Конечно, я не могу использовать graphicimage с bean-компонентом ViewScoped, поэтому мне пришлось создать bean-компонент ApplicationScoped (или SessionScoped)... но он работает только с ManagedBean   -  person Marco    schedule 20.05.2016
comment
Лучше используйте o:graphicImage от Omnifaces, если можете.   -  person jpangamarca    schedule 21.05.2016
comment
@Marco Это может быть проблема с масштабом. По умолчанию CDI использует только bean-компоненты с аннотациями, определяющими bean-компоненты, и аннотация области действия входит в их число. Посмотрите на мой ответ. Также попробуйте @RequestScoped и если работает, то это была ошибка в вашем импорте.   -  person OndroMih    schedule 23.05.2016


Ответы (1)


Убедитесь, что у вас есть javax.enterprise.context.ApplicationScoped в импорте.

Если у вас есть другой импорт для @ApplicationScoped (например, javax.faces.bean.ApplicationScoped), вам нужно настроить CDI для обнаружения всех bean-компонентов, а не только тех, у которых есть аннотации CDI (по умолчанию)

Чтобы настроить обнаружение для всех bean-компонентов, либо добавьте пустой beans.xml в каталог WEB-INF, либо, если у вас уже есть beans.xml, добавьте bean-discovery-mode="all" в элемент <beans>, например:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="annotated">
</beans>
person OndroMih    schedule 23.05.2016
comment
вы совершенно правы! Итак, проблема была в реализации CDI (enterprise.contexr vs.faces.beans). Можете ли вы дать мне ссылку куда-нибудь, чтобы я мог лучше изучить CDI? Спасибо большое - person Marco; 23.05.2016
comment
Для некоторых аннотаций вам действительно нужно быть осторожным с именами пакетов. В пакетах javax есть дубликаты аннотаций, которые имеют одно и то же имя, но другой пакет и, следовательно, разное значение. Например. @Singleton и @Singleton. Они бывают разных спецификаций, поэтому их нельзя смешивать. - person OndroMih; 24.05.2016
comment
Вы можете найти больше о CDI на этой странице: cdi-spec.org, а конкретно об открытии бина здесь : docs.jboss.org/cdi/spec/1.2/cdi -spec.html#type_discovery_steps - person OndroMih; 24.05.2016