Я обнаружил, что внедрение MediaData в SerializableResource решает первую ошибку, как сказал Махиэль. С некоторым обходным путем это работало и показывало изображение.
Чтобы помочь другим, пытающимся увидеть работоспособность компонента, поскольку официальная витрина не работает, следует простой пример. Просто с MediaBean:
package simple;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
@ManagedBean(name = "imageBean")
@RequestScoped
public class MediaBean {
private static final String RICHFACES_MEDIA_OUTPUT_IMAGE_SOURCE = "/images/image.jpg";
public void paint(final OutputStream out, final Object data) throws IOException {
if (data == null) {
return;
}
final byte[] imageData = getImage(Integer.parseInt((String) data));
final InputStream in = new ByteArrayInputStream(imageData);
try {
final BufferedImage bImageFromConvert = ImageIO.read(in);
ImageIO.write(bImageFromConvert, "png", out);
}
finally {
in.close();
}
}
private byte[] getImage(final int data) throws IOException {
final ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
final String resource = extContext.getResource(RICHFACES_MEDIA_OUTPUT_IMAGE_SOURCE).getFile();
final BufferedImage bImage = ImageIO.read(new File(resource));
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(bImage, "jpg", bos);
return bos.toByteArray();
}
}
и текст xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:rich="http://richfaces.org/rich"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
</h:head>
<body>
<h1>TEST</h1>
<rich:panel>
<a4j:mediaOutput element="img" cacheable="false" session="false"
createContent="#{imageBean.paint}" value="0" mimeType="image/jpeg" />
</rich:panel>
</body>
</html>
Помещая /images/image.jpg
в папку веб-приложения, он должен показать это изображение.
Несмотря на это, я продолжаю получать второе сообщение об ошибке в моей рабочей среде.
Исследуя, я обнаружил, что в мини-проекте, который я создал для тестирования на Tomcat, я использовал JSF 2.2.10 , а в своей рабочей среде я использую JBoss EAP 6.4, который поставляется с JSF 2.0.3-b05 . В обоих я использую RichFaces 4.5.17.Final и, очевидно, эта версия несовместима с JSF 2.0.3-b05.
При попытке использовать эту версию я получаю сообщение об ошибке:
org.apache.catalina.core.StandardContext listenerStart GRAVE:
Исключение при отправке события, инициализированного контекстом, в экземпляр прослушивателя
класс [com.sun.faces.config.ConfigureListener]
com.sun.faces.config.ConfigurationException: КОНФИГУРАЦИЯ СБОЙ!
Реализация JSF 2.0.3 - не поддерживает RichFaces
ExtendedPartialViewContext. Пожалуйста, обновите хотя бы до Мохарры 2.1.28
или 2.2.6
Проблема началась, когда мы начали переход с JBoss 6.1 на 6.4 и изменили версию RichFaces. Поэтому я считаю, что это является причиной проблемы, и возможное решение - обновить версию JSF.