When I try to save a new Item (parent class) I got an error because the type (DmItemType child class) property is null
It looks like that the forrm doesn't use the setAsText() method
I'm able to understand the reason "item.type" is null
Any idea where I'm wrong or do you know where I can find an example?
Thanks
Here the code:
Item.java
DmItemType.java:Code:public class Item implements Serializable { private Long id = null; private DmItemType type; private String name; .... setters & getters }
ItemFormController.javaCode:public class DmItemType implements Serializable { private Long id = null; private String name; ..... setters & getters }
DmItemTypePropertyEditor.javaCode:public ItemFormController() { setSessionForm(false); setBindOnNewForm(true); } protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { // customeditor for DmItemType binder.registerCustomEditor(DmItemType.class, new DmItemTypePropertyEditor(dmMgr)); } public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Item item = (Item) command; if (request.getParameter("delete") != null) { mgr.removeItem(item.getId().toString()); request.getSession().setAttribute("message", getText("item.deleted", item.getName())); } else { mgr.saveItem(item); request.getSession().setAttribute("message", getText("item.saved", item.getName())); } return new ModelAndView(getSuccessView()); } protected Object formBackingObject(HttpServletRequest request) throws ServletException { String itemId = request.getParameter("id"); Item item = null; if ((itemId != null) && !"".equals(itemId)) { item = mgr.getItem(itemId); if (item == null) { item = new Item(); } } else { String itemType = request.getParameter("itemType"); if ((itemType != null) && !"".equals(itemType)) { DmItemType dmItemType = dmMgr.getDmItemTypeByName(itemType); item = new Item(); if (dmItemType != null) { item.setType(dmItemType); } } else { item = new Item(); } } return item; }
itemForm.jspCode:public class DmItemTypePropertyEditor extends PropertyEditorSupport { private DmManager dmMgr; public DmItemTypePropertyEditor(DmManager dmMgr){ this.dmMgr = dmMgr; } public String getAsText() { DmItemType dmItemType = (DmItemType) getValue(); return dmItemType.getName(); } public void setAsText(String text) throws IllegalArgumentException { DmItemType dmItemType = null; if (text != null && !"".equals(text)){ dmItemType = dmMgr.getDmItemTypeByName(text); } setValue(dmItemType); } }
errorCode:<form method="post" action="<c:url value="/admin/itemForm.html"/>" name="itemForm"> <input type="hidden" name="item.id" value="<c:out value="${item.id}"/>"> <table class="detail"> <tr> <th><label for="type" class="required">* <fmt:message key="item.type"/>:</label></th> <td> <spring:bind path="item.type"> <input type="text" disabled name="type" value="${status.value}"/> <span class="fieldError">${status.errorMessage}</span> </spring:bind> </td> </tr> <tr> <th><label for="name" class="required">* <fmt:message key="item.name"/>:</label></th> <td> <spring:bind path="item.name"> <input type="text" name="name" value="${status.value}"/> <span class="fieldError">${status.errorMessage}</span> </spring:bind> </td> </tr> <tr> <th><label for="description"><fmt:message key="item.description"/>:</label></th> <td> <spring:bind path="item.description"> <input type="text" name="description" value="${status.value}"/> <span class="fieldError">${status.errorMessage}</span> </spring:bind> </td> </tr> <tr> <td></td> <td> <input type="submit" class="button" name="save" value="<fmt:message key="item.save"/>"/> <c:if test="${not empty param.id}"> <input type="submit" class="button" name="delete" value="<fmt:message key="item.delete"/>"/> </c:if> <input type="submit" class="button" name="cancel" value="<fmt:message key="item.cancel"/>" onclick="bCancel=true"/> </td> </tr> </table> </form>
Code:DEBUG - ItemFormController.onSubmit(81) | entering 'onSubmit' method... ------------------ WARN - DispatcherServlet.processHandlerException(872) | Handler execution resulted in exception - forwarding to resolved error view org.springframework.orm.hibernate.HibernateSystemException: not-null property references a null or transient value: it.tud.webaccess.model.Item.type; nested exception is net.sf.hibernate.PropertyValueException: not-null property references a null or transient value: it.tud.webaccess.model.Item.type net.sf.hibernate.PropertyValueException: not-null property references a null or transient value: it.tud.webaccess.model.Item.type at net.sf.hibernate.impl.SessionImpl.checkNullability(SessionImpl.java:1287) at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:939) at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:868) at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier(SessionImpl.java:786) at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:749) at net.sf.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:1398) at org.springframework.orm.hibernate.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:532) at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:312) at org.springframework.orm.hibernate.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:529) at it.tud.webaccess.dao.hibernate.ItemDAOHibernate.saveItem(ItemDAOHibernate.java:32) at it.tud.webaccess.service.impl.ObjManagerImpl.saveItem(ObjManagerImpl.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:284) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:56) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) at $Proxy0.saveItem(Unknown Source) at it.tud.webaccess.web.ItemFormController.onSubmit(ItemFormController.java:86) at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:248) at it.tud.webaccess.web.ItemFormController.processFormSubmission(ItemFormController.java:52) at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:235) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:128) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:675) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:623) at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:384) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:353) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:172) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at it.tud.webaccess.util.filter.GZIPFilter.doFilter(GZIPFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:738) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595)


Reply With Quote
