0

Product 개체의 일부인 파일 (그림)을 데이터베이스에 업로드하려고합니다. jsf 확인에 따라 파일 업로드가 완료되었습니다. 그러나 Product을 지속하면 그림없이 지속성이 성공적으로 완료됩니다. 서버가 스택을 반환하지 않습니다.primeFaces가 db에 파일 업로드 실패

<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> 

이 제품 컨트롤러 (간체) :

@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; 

:

@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();   
    } 

이 제품 엔티티 (간체)이다

은 (간체) 내 양식입니다 해결 방법 : 나는 e 관리 Bean의 범위는 다음과 같습니다.

@ViewScope 
+1

:

같은 ManagedBean은을 공유 할 수있는 두 개의 요청으로 범위를 변경 가능합니다. 그러면 제품을 유지하기 위해 버튼을 클릭 할 때 업로드 된 데이터를 포함하지 않는 새로운 requestscoped 빈이 생성됩니다. 콩보기를 만들어서이 이론을 시도하십시오 –

+0

@AkselWillgert 대단히 고마워요. 범위를보기 위해 그것을 변경하고 완벽하게 작동합니다. – lv10

답변

2

FileUpload는 첫 번째 요청에서 발생합니다.

양식이 입력 데이터와 함께 제출되면 새로운 두 번째 요청이 시작됩니다. 새로운 requestScoped ManagedBean이 생성되어 이전 파일 업로드에 대해 알지 못합니다. 는 파일 업로드가 별도의 요청이 먼저 일어나는 것을있을 수

@ViewScoped