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