Как использовать & lt; p: graphicImage / & gt; с @ViewScoped? [Дубликат]

Это то, что я использую:

function cloneObject(obj) {
    var clone = {};
    for(var i in obj) {
        if(typeof(obj[i])=="object" && obj[i] != null)
            clone[i] = cloneObject(obj[i]);
        else
            clone[i] = obj[i];
    }
    return clone;
}
43
задан BalusC 2 March 2015 в 09:11
поделиться

4 ответа

Ответ из BalusC является (как обычно) правильным.

Но сохраните одно (как уже было сказано им). Окончательный запрос выполняется из браузера, чтобы получить URL-адрес из созданного тега <img>. Это не выполняется в контексте jsf.

Итак, если вы попытаетесь, например, доступ к фазеId (протоколирование или по какой-либо причине)

context.getCurrentPhaseId().getName()

Это приведет к ошибке NullPointerException, и какое-то вводящее в заблуждение сообщение об ошибке вы получите:

org.primefaces.application.resource.StreamedContentHandler () - Error in streaming dynamic resource. Error reading 'image' on type a.b.SomeBean

мне достаточно времени, чтобы выяснить, в чем проблема.

85
ответ дан Community 21 August 2018 в 12:59
поделиться
  • 1
    BalusC, это именно то, что я искал, однако я просто не мог понять, как ответ должен быть отправлен клиенту. Ты действительно легенда. Большое спасибо. :) – Lyubomyr Shaydariv 20 March 2013 в 16:43
  • 2
  • 3
  • 4
    @Tiny: управляемые beans EJB и CDI вводятся как прокси. Вызов метода на экземпляре прокси-сервера в основном находит текущий экземпляр в своей области действия и затем вызывает на нем желаемый метод. Вы видите это легко обратно в stacktraces из исключений, исходящих из этих методов. Поэтому их область не привязана к сфере действия клиента и может быть легко меньше. – BalusC 28 May 2014 в 06:00
  • 5

Здесь есть пара возможностей (и, пожалуйста, опубликуйте весь класс, если это не так).

1) Вы не инициализируете изображение правильно. 2) Ваш поток пуст, поэтому вы ничего не получаю

Я предполагаю, что student.getImage () имеет подпись байта [], поэтому сначала убедитесь, что эти данные фактически нетронуты и представляют изображение. Во-вторых - вы не указываете тип контента, который должен быть «image / jpg» или все, что вы используете.

Вот некоторый код шаблона, чтобы проверить его, я использую для этого Primefaces 2.

/** 'test' package with 'test/test.png' on the path */
@RequestScoped
@ManagedBean(name="imageBean")
public class ImageBean
{
    private DefaultStreamedContent content;

    public StreamedContent getContent()
    {
        if(content == null)
        {
            /* use your database call here */
            BufferedInputStream in = new BufferedInputStream(ImageBean.class.getClassLoader().getResourceAsStream("test/test.png"));
            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int val = -1;
            /* this is a simple test method to double check values from the stream */
            try
            {
                while((val = in.read()) != -1)
                    out.write(val);
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }

            byte[] bytes = out.toByteArray();
            System.out.println("Bytes -> " + bytes.length);
            content = new DefaultStreamedContent(new ByteArrayInputStream(bytes), "image/png", "test.png");
        }

        return content;
    }
}

и некоторая разметка ...

<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.prime.com.tr/ui"
>

    <h:head>

    </h:head>

    <h:body>
        <p:graphicImage value="#{imageBean.content}" />
    </h:body>
</html>

Если этот код работает, то вы настроены правильно. Несмотря на то, что это код мусора для потоков (не используйте его в процессе производства) , он должен дать вам возможность устранить неисправность. Я предполагаю, что вы можете что-то происходить в вашей JPA или другой базе данных, где вы байт [] пуст или он отформатирован неправильно. Кроме того, у вас может быть проблема с контентом.

Наконец, я бы клонировал данные из компонента, чтобы student.getImage () был только скопирован в новый массив, а затем использован. Таким образом, если у вас что-то неизвестное происходит (что-то еще перемещает объект или меняет байт [], вы не возитесь с вашими потоками.

Сделайте что-то вроде:

byte[] data = new byte[student.getImage().length]
for(int i = 0; i < data.length; i++)
  data[i] = student.getImage()[i];

, так что ваш bean-экземпляр имеет копию (или Arrays.copy () - независимо от того, что плавает ваша лодка). Я не могу подчеркнуть, что что-то простое, как этот / тип содержимого, как правило, неверно. Удачи вам.

3
ответ дан Daniel B. Chapman 21 August 2018 в 12:59
поделиться

Попробуйте включить тип mime. В вашем опубликованном примере у вас есть это как "". Пустое изображение может быть связано с тем, что он не распознает поток как файл изображения, так как вы сделали это поле пустой строкой. Поэтому добавьте тип mime image / png или image / jpg и посмотрите, работает ли это:

String mimeType = "image/jpg";
StreamedContent file = new DefaultStreamedContent(bytes, mimeType, filename);  
4
ответ дан rcheuk 21 August 2018 в 12:59
поделиться
87
ответ дан Community 1 November 2018 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: