2016-02-11 4 views
1

Отображение изображения BLOB с использованием <p:graphicImage> следующим образом.Отображение BLOB-изображения с использованием p: graphicImage в файле тегов

<p:graphicImage value="#{categoryBean.image}"> 
    <f:param name="id" value="7"/> 
</p:graphicImage> 

Где CategoryBean была определена следующим образом.

@Named 
@ApplicationScoped 
public class CategoryBean { 

    @Inject 
    private CategoryService service; 

    public CategoryBean() {} 

    public StreamedContent getImage() throws IOException { 
     FacesContext context = FacesContext.getCurrentInstance(); 

     if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
      return new DefaultStreamedContent(); 
     } else { 
      String id = context.getExternalContext().getRequestParameterMap().get("id"); 
      byte[] bytes = Utils.isNumber(id) ? service.findImageById(Long.parseLong(id)) : null; 
      return bytes == null ? null : new DefaultStreamedContent(new ByteArrayInputStream(bytes)); 
     } 
    } 
} 

Что касается вышеуказанного подхода, следующий пользовательский тег должен работать безупречно, но он не может отобразить изображение на <p:graphicImage> без ошибки/исключения.

<my:image bean="#{categoryBean}" property="image" paramName="id" paramValue="7"/> 

Файл тега находится под /WEB-INF/tags/image.xhtml.

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:p="http://primefaces.org/ui" 
       xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
       xmlns:f="http://xmlns.jcp.org/jsf/core"> 

    <p:graphicImage value="#{bean[property]}"> 
     <f:param name="#{paramName}" value="#{paramValue}"/> 
    </p:graphicImage> 
</ui:composition> 

Сформированный <img> тег кажется выглядеть хорошо:

<img id="form:j_idt4" 
    src="/ContextPath/javax.faces.resource/dynamiccontent.properties.xhtml?ln=primefaces&amp;v=5.3&amp;pfdrid=IA0%2F7ZuBnGS%2BSzeb%2BHyPOTo4Pxp4hjI6&amp;pfdrt=sc&amp;id=7&amp;pfdrid_c=true" 
    alt=""/> 

Это только возвращает ошибку 404 HTTP.

Есть ли недостаток в определении настраиваемого тега?

+1

я не чувствовал себя плохо, но есть некоторые замаскированные PrimeFaces ребята, которые не любят публично выставляя ошибки в их программном обеспечении непрерывно вниз голосование, когда я отправляю вопрос, раскрывающий давнюю ошибку? – Tiny

ответ

1

Это связано с тем, как PrimeFaces <p:graphicImage> идентифицирует запросы изображений. В принципе, он преобразует точное значение выражения #{bean[property]} в строку, зашифровывает его, а затем передает его как значение pfdrid. Когда веб-браузеру необходимо загрузить изображение с помощью нового HTTP-запроса, это выражение выражения расшифровывается и оценивается в «текущем» EL-контексте. Однако в этот момент нет нигде #{bean} или #{property}, доступных в любом месте в контексте EL, потому что нет средств представления JSF с tagfiles и всеми. В контексте EL доступны только объекты запроса, сеанса и приложения.

Нет ничего, что можно было бы сделать против этого, кроме сообщения о проблеме у парней PrimeFaces.

Что касается альтернативных решений, то OmniFaces <o:graphicImage> лучше справляется с этим, проверяя целевой компонент/метод во время ответа рендера, а не во время потоковой передачи изображения. Он сразу же проверяет #{bean[property]}, обнаруживает, что он фактически представляет #{categoryBean.image}, а затем преуспевает. Просто, чтобы быть уверенным, что я тестировал его в файле тегов, как и у вас, и он отлично работает для меня, тогда как PF действительно не работает, как описано.

<o:graphicImage value="#{bean[property](paramValue)}" /> 

public byte[] getImage(Long id) throws IOException { 
    return service.findImageById(id); 
} 
+0

Там '' java.lang.NullPointerException' прямо, используя '' (OmniFaces 2.2/Mojarra 2.2.12) - 'java.lang.NullPointerException at org.omnifaces.el.MethodReference. (MethodReference.java:45) '. – Tiny

+0

Недвижимость должна, конечно, быть 'getImage'. NPE по крайней мере не прав, код должен был бросить здесь 'MethodNotFoundException'. – BalusC

+0

Причина указана как «java.lang.NullPointerException». – Tiny

Смежные вопросы