【问题标题】:Null Exception Saving value from Dropdown下拉列表中的空异常保存值
【发布时间】:2015-05-10 04:30:19
【问题描述】:

我正在将产品对象保存到数据库中,当我对字段使用输入时一切正常,但下拉菜单出现问题我收到以下错误,因为 idcategory 返回 Null:

org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [paxtecum] in context with path [/paxtecum] threw exception [Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'idcategory' cannot be null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
    at com.mysql.jdbc.Util.getInstance(Util.java:383)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1049)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2840)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2334)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246)
    at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
    at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:490)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:195)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:179)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:214)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
    at com.wizardofoz.paxtecum.web.dao.ProductDao.create(ProductDao.java:28)
    at com.wizardofoz.paxtecum.web.dao.ProductDao$$FastClassBySpringCGLIB$$8c448070.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
    at com.wizardofoz.paxtecum.web.dao.ProductDao$$EnhancerBySpringCGLIB$$c35808a4.create(<generated>)
    at com.wizardofoz.paxtecum.web.service.ProductService.create(ProductService.java:19)
    at com.wizardofoz.paxtecum.web.controllers.ProductController.createProduct(ProductController.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)**


product DAO class:


            ProductDao.java
            import java.util.Date;
            import java.util.List;

            import org.hibernate.Session;
            import org.hibernate.SessionFactory;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.stereotype.Component;
            import org.springframework.stereotype.Repository;
            import org.springframework.transaction.annotation.Transactional;

            @Repository
            @Transactional
            @Component
            public class ProductDao {

                @Autowired
                private SessionFactory sessionFactory;

                public Session session() {
                    return sessionFactory.getCurrentSession();
                }   
                public void create(Product product) {

                    product.setCreatedate(new Date());          
                    session().save(product);
                }

                public List<Product> getProducts() {

                    return session().createQuery("from Product").list();
                }

            }

newproduct.jsp


        <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
            pageEncoding="ISO-8859-1"%>
        <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>

        <form method="post"
            action="${pageContext.request.contextPath}/createproduct">

            <table>
                <tr>
                    <td>Product</td>
                    <td><input name="name" type="text" /></td>
                </tr>

                <tr>
                    <td>Category</td>
                    <td><sf:select path="categories" >
                           <sf:option value="-" label="Select a Category"></sf:option>
                            <sf:options items="${categories}" itemValue="idcategory" 
                            itemLabel="name" />
                        </sf:select></td>
                </tr>

                <tr>            
                    <td><input value="Save" type="submit" /></td>
                </tr>

            </table>

        </form>


ProductController.java


    import java.util.List;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    import com.wizardofoz.paxtecum.web.dao.Category;
    import com.wizardofoz.paxtecum.web.dao.Product;
    import com.wizardofoz.paxtecum.web.service.CategoryService;
    import com.wizardofoz.paxtecum.web.service.ProductService;

    @Controller
    public class ProductController {

        @Autowired
        private CategoryService categoryService;

        @Autowired
        private ProductService productService;

        @RequestMapping("/newproduct")
        public String newcategory(Model model) {

            List<Category> categories = categoryService.getAllCategories();

            model.addAttribute("categories",categories);
            return "newproduct";
        }

        @RequestMapping(value="/createproduct", method=RequestMethod.POST)
        public String createProduct(Product product, BindingResult result){

            productService.create(product);

            return "productcreated";
        }

        @RequestMapping(value="/products")
        public String getProducts(Model model) { 

            List<Product> products = productService.getProducts();
            model.addAttribute("products", products);

            return "products";
        }

    }
Product.java
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="products")
public class Product  {
    @Id
    @Column(name="idproducts")
    @GeneratedValue
    private int id;

    @ManyToOne
    @JoinColumn(name="idcategory")
    private Category category;
    private String name;
    private Date createdate;


    @Override
    public String toString() {
        return "Product [id=" + id + ", category=" + category + ", name="
                + name + ", createdate=" + createdate + "]";
    }

    public Product(){

    }

    public Product(Category category, String name, Date createdate) {
        super();
        this.category = category;
        this.name = name;
        this.createdate = createdate;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getCreatedate() {
        return createdate;
    }
    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }


}

Category.java
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="category")
public class Category {

    @Id
    @GeneratedValue
    private int idcategory;
    private String name;
    private Date createdate;


    @Override
    public String toString() {
        return "Category [idcategory=" + idcategory + ", name=" + name
                + ", createdate=" + createdate + "]";
    }


    public int getIdcategory() {
        return idcategory;
    }


    public void setIdcategory(int idcategory) {
        this.idcategory = idcategory;
    }


    public Category(String name, Date createdate) {
        super();
        this.name = name;
        this.createdate = createdate;
    }


    public Category() {
    }


    public String getName() {
        return name;
    }


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


    public Date getCreatedate() {
        return createdate;
    }


    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }

}

会有什么问题?

【问题讨论】:

  • 欢迎使用stackoverflow,快速查看How to ask question,为您的问题提供更多解释以获得快速/更好的答案。
  • 您的 JSP 页面和 spring 表单绑定不正确,您有 &lt;sf:select path="categories" &gt; 但未指定表单绑定对象的名称(commandName/ModelAttribute)和操作 url 也丢失。
  • 好吧,我解决了这个问题,将 name="category.idcategory" 添加到:sf:select path="categories"> 和 commandName/ModelAttribute。谢谢。

标签: java mysql hibernate spring-mvc


【解决方案1】:

将您的控制器处理程序方法更改为:

//Here, add a Product instance to model as you have done for categories, for binding product information from JSP.
@RequestMapping("/newproduct")
public String newcategory(Model model) {

   List<Category> categories = categoryService.getAllCategories();
   model.addAttribute("categories",categories);
   model.addAttribute("newProduct",new Product()); //missing
   return "newproduct";
}

然后在您的 POST 处理程序中从模型中获取 Product 实例。

@RequestMapping(value="/createproduct", method=RequestMethod.POST)
public String createProduct(@ModelAttribute("newProduct")Product product, BindingResult result){

   //Here, validate product instance
   //Here, set product/category relationships
   Category category = productService.findOne(product.getCategory().getIdcategory()); //validate for null
   product.setCategory(category);

   productService.create(product);

   return "productcreated";
}

最后,在 JSP 中指定模型属性名称和操作 URL:

<sf:form method="post"
    action="${pageContext.request.contextPath}/createproduct" modelAttribute="newProduct">

 Product
    <sf:input path="name"/>
 Category
    <sf:select path="category.idcategory">
      <sf:option value="0" label="Select a Category"></sf:option>
      <sf:options items="${categories}" itemValue="idcategory" 
                    itemLabel="name" />
    </sf:select>
      <input value="Save" type="submit" />
</sf:form> 

【讨论】:

  • 嗨 Rembo:我添加了所有建议的代码,但我仍然有问题。关于 Product 和 Category 之间的关系我认为在 Product 类中使用注释(见上文)可能我错了。我将 action 和 url 放在 sf:select 中,但我不明白为什么我将它放在主窗体中。
  • 感谢您的帮助和时间 Rembo
  • @user3856842 你能显示你的类别类吗?您需要在产品保存之前找到并设置产品的类别..并从 ProductDAO 类中删除组件注释保留一个..
  • 我在上面添加了类别类。为什么要去掉组件注解,Spring不需要它来检测和实例化组件吗?
  • @user3856842 答案已更新,是的,您必须删除组件保留存储库中的任何一个(而不是两者),以便 spring 实例化。
【解决方案2】:

在尝试将 int 插入数据库之前,尝试对 idcategory 变量执行 system.out.println()。我怀疑 idcategory 值没有从下拉列表中正确读取。

【讨论】:

  • 嗨克莱德:这就是发生的事情,但我不知道为什么。感谢您的帮助和时间。
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多