3

顧客画像 ( CustomerMaster.customerPhotoBLOB オブジェクトに格納) を表示しようとしています。imageBuilder Bean (RequestScoped) を使用して、保存されているコンテンツに基づいて画像を作成してCustomerMasterいます。これは、Customer Bean (ViewScoped) で利用できます。顧客 Bean の CustomerMaster オブジェクトにアクセスするために、ImageBuilder にプロパティを追加しました。また、トレース目的で sysout ステートメントを追加しました。

ここに出力があります

09:34:22,817 INFO  [stdout] (http--127.0.0.1-8080-2) getImage - 1
09:34:22,817 INFO  [stdout] (http--127.0.0.1-8080-2) getImage - 3
09:34:22,817 INFO  [stdout] (http--127.0.0.1-8080-2) getImage - 4
09:34:22,817 INFO  [stdout] (http--127.0.0.1-8080-2) getImage - 5PhotoMaster [photoId=1,  contentType=image/gif]    2064
09:34:22,817 INFO  [stdout] (http--127.0.0.1-8080-2) getImage - 6
09:34:22,827 WARNING [javax.enterprise.resource.webcontainer.jsf.context] (http--127.0.0.1-8080-2) JSF1091: No mime type could be found for file dynamiccontent.  To resolve this, add a mime-type mapping to the applications web.xml.
09:34:23,057 SEVERE [org.primefaces.application.PrimeResourceHandler] (http--127.0.0.1-8080-4) Error in streaming dynamic resource. Unable to set property customerBean for managed bean imageBuilderBean

sysout ステートメントに基づいて、ImageBuilderBean が CustomerMaster オブジェクトにアクセスでき、DefaultStreamedContent を作成できることがわかります。

しかし、後で次のような深刻なメッセージが表示され、画像が Web ページに表示されません

09:34:23,057 SEVERE [org.primefaces.application.PrimeResourceHandler] (http--127.0.0.1-8080-4) Error in streaming dynamic resource. Unable to set property customerBean for managed bean imageBuilderBean

(ViewScoped の代わりに) CustomerBean で Session スコープを使用すると、すべてが作業ファイルになります。画像もウェブページに表示されます。私の理解によれば、requestScoped Bean から Viewscoped Bean を呼び出す際に問題はないはずです。

何が悪いのかわかりません。助けてください。参照用のコードを参照してください。

ImageBuilder.Java

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

    @ManagedBean (name="imageBuilderBean")
    @RequestScoped
    public class ImageBuilderBean implements Serializable {

        private static final long serialVersionUID = -480089903900643650L;

        @ManagedProperty(value="#{customerBean}")    
        private CustomerBean customerBean;

        private StreamedContent image;

        public ImageBuilderBean() {
            super();
        }

        @PostConstruct
        void ResetBean(){
            System.out.println("getImage - 1");

            FacesContext context = FacesContext.getCurrentInstance();

            if (context.getRenderResponse()) {
                System.out.println("getImage - 2");
                // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
                image = new DefaultStreamedContent();
            }
            else {
                System.out.println("getImage - 3");

                CustomerMaster custMaster = customerBean.getCustMaster();
                if (custMaster != null){
                    System.out.println("getImage - 4");

                    PhotoMaster photo = custMaster.getCustomerPhoto();
                    if (photo != null) {

                        try {
                            System.out.println("getImage - 5" + photo + "    " + photo.getContent().length());
                            InputStream inputStream = photo.getContent().getBinaryStream();
                            image = new DefaultStreamedContent(inputStream, photo.getContentType());
                            System.out.println("getImage - 6");
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            System.out.println("exception Shirish");
                            e.printStackTrace();
                        }
                    }
                }
            }
        }

Customer.XHTML

<p:column>
    <p:graphicImage id="custImageId" value="#{imageBuilderBean.image}" cache="false" />
</p:column> 

CustomerBean.Java

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

@ManagedBean (name="customerBean")
@ViewScoped
public class CustomerBean implements Serializable {

private static final long serialVersionUID = -3727342589028832013L;
// Setters and Getters

アップデート:

graphicImage タグが<img>html タグに変換されるため。ブラウザは、画像を表示するために 2 つのリクエストを生成します。次の 2 つの URL が生成されます。

  1. /proj/views/user/CustomerRegistration.xhtml - ManagedProperty アノテーションは、viewscoped customerBeans を返します。

  2. /proj/javax.faces.resource/dynamiccontent.xhtml・customerBeanの返却に失敗しました。したがって、「マネージド Bean imageBuilderBean のプロパティ customerBean を設定できません」というエラー メッセージが表示されます。

助言がありますか?

4

1 に答える 1

2

問題は ViewScoped および SessionScoped Bean のロジックにあります。

RequestScoped Bean では、すべてのリクエストが新しい Bean インスタンスによって処理されます。SessionScoped Bean では
、同じセッションを運ぶすべてのリクエストが同じインスタンスによって処理されます。

ViewScoped Bean は、これら 2 つの「中間」にあるものです。セッション Bean のように機能する「疑似セッション」を作成しますが、他の方法でフェッチされます。ブラウザがセッション情報を送信するセッション スコープ Bean と同じ方法では処理されませんが (たとえば、Cookie やその他の方法で)、「Web ページ」自体に (JavaScript で) 保持されるため、Web ページによって送信される ajax 要求ごとに、独自の「vievSessionKey」を追加します(各ビューに固有)。

ページを表示している間、ブラウザーは Web ページの要求を送信し、ブラウザー (Web ページではない) は各画像に対して別の要求を送信します。この場合、画像リクエストは Web ページのリクエスト中に生成された viewSessionKey を持たないため、Bean は別の新しいビューとして動作し、新しい Bean インスタンスを初期化します。

ViewScoped Bean でそのような操作を行いたい場合は、各 Bean の新しいインスタンスごとにデータを運ぶ方法を実装する必要があります。画像データまたはいくつかの静的フィールドを運ぶある種のシングルトンマネージャーを作成することができます。しかし、これはこの問題を解決する「醜い」方法であり、より論理的な方法は、Beanセッションをスコープにすることです...または、少なくともいくつかの機能を新しいセッションスコープBeanに分離します。

ps:恐竜の問題を掘り下げたことは知っていますが、同じ問題を抱えていて、あなたの質問を読んでいるときに、Bean タイプごとに javascripts/browser によって何が行われるかのロジックに気付きました

于 2013-02-06T21:17:32.733 に答える