0

Productオブジェクトの一部であるファイル (画像) をデータベースにアップロードしようとしています。jsfの確認によると、ファイルのアップロードは成功です。ただし、永続化するとProduct、永続化は画像なしで正常に完了します。サーバーはスタックを返しません。

これは私のフォームです(簡略化):

<h:form enctype="multipart/form-data">
                <h1><h:outputText value="Create New Product"/></h1>
                <h:panelGrid columns="2">

                    <h:outputLabel value="Name:" for="name" />
                    <h:inputText id="name" value="#{productController.product.name}" title="Name" />

                    <h:outputLabel value="Description:" for="description" />
                    <h:inputText id="description" value="#{productController.product.description}" title="Description" />

                    <h:outputLabel value="Price:" for="price" />
                    <h:inputText id="price" value="#{productController.product.price}" title="Price" />                     

                    <h:outputLabel value="Category:" for="category_fk" />
                    <h:selectOneMenu id="category_fk" value="#{productController.product.category_fk}" 
                                     converter="#{categoryConverter}" title="Category_fk" >                        
                        <f:selectItems value="#{productController.categoryList}" var="prodCat"
                                       itemValue="#{prodCat}" itemLabel="#{prodCat.name}"/>
                    </h:selectOneMenu>                                    

                    <p:fileUpload fileUploadListener="#{productController.handleFileUpload}" update="msg" auto="true" />                                                
                    <p:growl id="msg" showDetail="true"/>


                    <h:inputHidden id="dateAdded" value="#{productController.product.dateAdded}">
                        <f:convertDateTime pattern="yyyy/MM/dd HH:mm:ss" />
                    </h:inputHidden>

                </h:panelGrid>

                <h:commandButton value="Create Product" action="#{productController.doCreateProduct()}"/>

            </h:form>

これは製品コントローラー (簡略化):

@ManagedBean
@RequestScoped
public class ProductController {

    @EJB
    private ProductEJB productEjb;
    @EJB
    private CategoryEJB categoryEjb;

    private Product product = new Product();
    private List<Product> productList = new ArrayList<Product>();

    private Category category;
    private List<Category> categoryList = new ArrayList<Category>();

    // -------------------------------------------------------- Business Methods
    public String doCreateProduct()
    {

        product = productEjb.createProduct(product);
        productList = productEjb.findAllProducts();
        return "listProduct?faces-redirect=true";
    }


    public String doDeleteProduct()
    {
        productEjb.deleteProduct(product);        
        return "listProduct?faces-redirect=true";
    }

    public String cancelDeleteAction()
    {
        return "listProduct?faces-redirect=true";
    }

        // Update product listing
        public void preRenderView()
        {
            if(product == null)
            {
                product = new Product();                
            }            
        }

        public String doUpdateProduct()
        {
            if(product.getProduct_id() != 0)
            {
                productEjb.updateProduct(product);                
            }
            else
            {
                productEjb.createProduct(product);
            }

            //addFlashMessage("Product " + product.getName() + " (" + product.getProduct_id() + ") has been updated");

            return "listProduct?faces-redirect=true";
        }

        public void handleFileUpload(FileUploadEvent event)
        {
            byte[] uploadedFile = new byte[event.getFile().getContents().length];
            System.arraycopy(event.getFile().getContents(), 0, uploadedFile, 0, event.getFile().getContents().length);
            product.setImageFile(uploadedFile);

            FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + "is uploaded.");        
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    @PostConstruct
    public void init()
    {
        categoryList = categoryEjb.findAllCategory();
        productList = productEjb.findAllProducts();        
    }

これは製品エンティティです (簡略化):

@Entity
@NamedQueries({
    @NamedQuery(name="findAllProducts", query = "SELECT p from Product p")

})
public class Product implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy= GenerationType.AUTO)
    private int product_id;
    private String name;
    private String description;
    @Lob
    @Column(name="imageFile")
    protected byte[] imageFile;
    private Float price;
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateAdded;        
    @ManyToOne
    private Category category_fk;
    @OneToOne(mappedBy = "product_fk")
    private SaleDetails saleDetails_fk;

解決策: マネージド Bean のスコープを次のように変更しました。

@ViewScope
4

1 に答える 1

3

ファイルのアップロードは、最初のリクエストで発生します。

入力データとともにフォームが送信されると、新しい 2 番目のリクエストが開始されます。以前のファイルアップロードを認識しない、新しい requestScoped ManagedBean が作成されます。

2 つの要求が同じマネージド Bean を共有できるようにするには、スコープを次のように変更します。

@ViewScoped 
于 2012-11-16T17:55:14.953 に答える