PDA

View Full Version : Spring MVC File Upload Problem



presidentrodel
Jun 10th, 2011, 04:04 AM
Hello developers,

I am having an error during my file upload app execution. This is my error:



org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBinding Result: 1 errors
Field error in object 'product' on field 'productImage': rejected value [org.springframework.web.multipart.commons.CommonsM ultipartFile@151c368]; codes [typeMismatch.product.productImage,typeMismatch.pro ductImage,typeMismatch.[B,typeMismatch]; arguments [org.springframework.context.support.DefaultMessage SourceResolvable: codes [product.productImage,productImage]; arguments []; default message [productImage]]; default message [Failed to convert property value of type 'org.springframework.web.multipart.commons.Commons MultipartFile' to required type 'byte[]' for property 'productImage'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [org.springframework.web.multipart.commons.CommonsM ultipartFile] to required type [byte] for property 'productImage[0]': PropertyEditor [org.springframework.beans.propertyeditors.CustomNu mberEditor] returned inappropriate value]
org.springframework.web.bind.annotation.support.Ha ndlerMethodInvoker.doBind(HandlerMethodInvoker.jav a:820)
org.springframework.web.bind.annotation.support.Ha ndlerMethodInvoker.resolveHandlerArguments(Handler MethodInvoker.java:359)
org.springframework.web.bind.annotation.support.Ha ndlerMethodInvoker.invokeHandlerMethod(HandlerMeth odInvoker.java:171)
org.springframework.web.servlet.mvc.annotation.Ann otationMethodHandlerAdapter.invokeHandlerMethod(An notationMethodHandlerAdapter.java:427)
org.springframework.web.servlet.mvc.annotation.Ann otationMethodHandlerAdapter.handle(AnnotationMetho dHandlerAdapter.java:415)
org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:788)
org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:717)
org.springframework.web.servlet.FrameworkServlet.p rocessRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.d oPost(FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service(HttpServlet .java:641)
javax.servlet.http.HttpServlet.service(HttpServlet .java:722)




this is my entity class:


@Entity
public class Product {

@Id
@GeneratedValue
private Long id;

private byte[] productImage;
private String name;
private String description;

public byte[] getProductImage() {
return productImage;
}

public void setProductImage(byte[] productImage) {
this.productImage = productImage;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

}



and this is my controller:


@Controller
@RequestMapping("/products")
public class ProductController {

@Autowired
private ProductDAO productDAO;

protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws ServletException {
binder.registerCustomEditor(byte[].class,
new ByteArrayMultipartFileEditor());
}

@SuppressWarnings("unused")
@RequestMapping(method = RequestMethod.GET)
private String showProducts(Model model) {
List<Product> listOfAllProducts = productDAO.findAll();
model.addAttribute("listOfProducts", listOfAllProducts);
return "productHome";
}

@SuppressWarnings("unused")
@RequestMapping(value = "/addProduct", method = RequestMethod.GET)
private String addProduct(@ModelAttribute Product product) {
return "addProductPage";
}

@SuppressWarnings("unused")
@RequestMapping(value = "/addProduct", method = RequestMethod.POST)
private String addProductSuccess(@ModelAttribute Product product) {
productDAO.saveProduct(product);
return "redirect:/products";
}
}


Please help me with this problem.
Thanks.

Marten Deinum
Jun 10th, 2011, 04:11 AM
Annotate your initBinder method with @InitBinder, currently your method isn't doing anything.

presidentrodel
Jun 10th, 2011, 04:19 AM
Thanks for reply sir. I followed your instructions but still i got errors, this are my errors:



com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'product_image' at row 1
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3595)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3529)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:19 90)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java :2151)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionIm pl.java:2625)
com.mysql.jdbc.PreparedStatement.executeInternal(P reparedStatement.java:2119)
com.mysql.jdbc.PreparedStatement.executeUpdate(Pre paredStatement.java:2415)
com.mysql.jdbc.PreparedStatement.executeUpdate(Pre paredStatement.java:2333)
com.mysql.jdbc.PreparedStatement.executeUpdate(Pre paredStatement.java:2318)
org.apache.commons.dbcp.DelegatingPreparedStatemen t.executeUpdate(DelegatingPreparedStatement.java:2 33)
org.hibernate.id.IdentityGenerator$GetGeneratedKey sDelegate.executeAndExtract(IdentityGenerator.java :94)
org.hibernate.id.insert.AbstractReturningDelegate. performInsert(AbstractReturningDelegate.java:57)
org.hibernate.persister.entity.AbstractEntityPersi ster.insert(AbstractEntityPersister.java:2345)
org.hibernate.persister.entity.AbstractEntityPersi ster.insert(AbstractEntityPersister.java:2852)
org.hibernate.action.EntityIdentityInsertAction.ex ecute(EntityIdentityInsertAction.java:71)
org.hibernate.engine.ActionQueue.execute(ActionQue ue.java:273)
org.hibernate.event.def.AbstractSaveEventListener. performSaveOrReplicate(AbstractSaveEventListener.j ava:320)
org.hibernate.event.def.AbstractSaveEventListener. performSave(AbstractSaveEventListener.java:203)
org.hibernate.event.def.AbstractSaveEventListener. saveWithGeneratedId(AbstractSaveEventListener.java :129)
org.hibernate.ejb.event.EJB3PersistEventListener.s aveWithGeneratedId(EJB3PersistEventListener.java:6 9)
org.hibernate.event.def.DefaultPersistEventListene r.entityIsTransient(DefaultPersistEventListener.ja va:179)
org.hibernate.event.def.DefaultPersistEventListene r.onPersist(DefaultPersistEventListener.java:135)
org.hibernate.event.def.DefaultPersistEventListene r.onPersist(DefaultPersistEventListener.java:61)
org.hibernate.impl.SessionImpl.firePersist(Session Impl.java:808)
org.hibernate.impl.SessionImpl.persist(SessionImpl .java:782)
org.hibernate.impl.SessionImpl.persist(SessionImpl .java:786)
org.hibernate.ejb.AbstractEntityManagerImpl.persis t(AbstractEntityManagerImpl.java:672)
sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.orm.jpa.SharedEntityManagerCre ator$SharedEntityManagerInvocationHandler.invoke(S haredEntityManagerCreator.java:240)
$Proxy66.persist(Unknown Source)
com.sti.ThesisProj.ProductDAOImpl.saveProduct(Prod uctDAOImpl.java:20)
com.sti.ThesisProj.ProductDAOImpl$$FastClassByCGLI B$$1c479535.invoke(<generated>)
net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy. java:191)
org.springframework.aop.framework.Cglib2AopProxy$C glibMethodInvocation.invokeJoinpoint(Cglib2AopProx y.java:688)
org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :150)
org.springframework.dao.support.PersistenceExcepti onTranslationInterceptor.invoke(PersistenceExcepti onTranslationInterceptor.java:155)
org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :172)
org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:110)
org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :172)
org.springframework.aop.framework.Cglib2AopProxy$D ynamicAdvisedInterceptor.intercept(Cglib2AopProxy. java:621)
com.sti.ThesisProj.ProductDAOImpl$$EnhancerByCGLIB $$fe7608f6.saveProduct(<generated>)
com.sti.ThesisProj.ProductController.addProductSuc cess(ProductController.java:49)
sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.web.bind.annotation.support.Ha ndlerMethodInvoker.invokeHandlerMethod(HandlerMeth odInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.Ann otationMethodHandlerAdapter.invokeHandlerMethod(An notationMethodHandlerAdapter.java:427)
org.springframework.web.servlet.mvc.annotation.Ann otationMethodHandlerAdapter.handle(AnnotationMetho dHandlerAdapter.java:415)
org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:788)
org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:717)
org.springframework.web.servlet.FrameworkServlet.p rocessRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.d oPost(FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service(HttpServlet .java:641)
javax.servlet.http.HttpServlet.service(HttpServlet .java:722)

I change the maxUploadSize property to 8000000 but still it has the same errors.
Can you help me with my problem sir.
Thanks.

Marten Deinum
Jun 10th, 2011, 06:38 AM
The exception is pretty clear, you try to store something in the database and your column isn't properly sized (it might even be of the wrong type).

presidentrodel
Jun 10th, 2011, 08:30 AM
I see. Sir, what datatype should i used to store the file also in the database.

Marten Deinum
Jun 12th, 2011, 12:19 PM
You probably want to use a BLOB.... I suggest reading about the datatypes and what they can hold/store..