2012-10-04 31 views
7

我試圖插入一個記錄到表中,我得到以下錯誤: 我也嘗試使用「?」對於sql語句中的參數並得到相同的錯誤。春天 - 無效的參數值:java.io.NotSerializableException

錯誤

54080 [http-8084-2] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'Sybase' 
54080 [http-8084-2] INFO org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 
54080 [http-8084-2] DEBUG org.springframework.jdbc.support.SQLErrorCodesFactory - Looking up default SQLErrorCodes for DataSource [[email protected]] 
54083 [http-8084-2] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 
54085 [http-8084-2] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource 
54085 [http-8084-2] DEBUG org.springframework.jdbc.support.SQLErrorCodesFactory - Database product name cached for DataSource [[email protected]]: name is 'MySQL' 
54090 [http-8084-2] DEBUG org.springframework.jdbc.support.SQLErrorCodesFactory - SQL error codes for 'MySQL' found 
54090 [http-8084-2] DEBUG org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator - Unable to translate SQLException with Error code '0', will now try the fallback translator 
54091 [http-8084-2] DEBUG org.springframework.jdbc.support.SQLStateSQLExceptionTranslator - Extracted SQL state class 'S1' from value 'S1009' 
54092 [http-8084-2] INFO com.crimetrack.jdbc.JdbcOfficersDAO - PreparedStatementCallback; SQL [INSERT INTO crimetrack.tblofficers (userName,password, fName, lName, oName, divisionNo, poisitionId, emailAdd, startDate, endDate, genderId, phoneNo, dob) VALUES (:userName,:password, :fName, :lName, :oName, :divisionNo, :poisitionId, :emailAdd, :startDate, :endDate, :genderId, :phoneNo, :dob)]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException 
54092 [http-8084-2] DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - Method [handleRequest] returned [ModelAndView: reference to view with name 'officer_registration'; model is null] 
54092 [http-8084-2] DEBUG org.springframework.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'officer_registration'; URL [/WEB-INF/jsp/officer_registration.jsp]] in DispatcherServlet with name 'crimetrack' 

JdbcOfficersDAO

public void saveOfficer(Officers officer) { 
    logger.info("In saveOfficer"); 


    try{    

     String sql= "INSERT INTO crimetrack.tblofficers (userName,password, fName, lName, oName, " + 
        "divisionNo, poisitionId, emailAdd, startDate, endDate, genderId, " + 
        "phoneNo, dob) VALUES (:userName,:password, :fName, :lName, :oName, :divisionNo, "+ 
        ":poisitionId, :emailAdd, :startDate, :endDate, :genderId, " + 
        ":phoneNo, :dob)"; 

     logger.debug("Executing saveOfficer String " + sql); 
     int count = getJdbcTemplate().update(sql,new MapSqlParameterSource() 
       .addValue("userName",officer.getUserName()) 
       .addValue("password", officer.getPassword()) 
       .addValue("fName", officer.getfName()) 
       .addValue("lName", officer.getlName()) 
       .addValue("oName", officer.getoName()) 
       .addValue("divisionNo", officer.getDivisionNo()) 
       .addValue("positionId",officer.getPositionId()) 
       .addValue("emailAdd", officer.getEmailAdd()) 
       .addValue("startDate", officer.getStartDate()) 
       .addValue("endDate", officer.getEndDate()) 
       .addValue("genderId", officer.getGenderId()) 
       .addValue("phoneNo",officer.getPhoneNo()) 
       .addValue("dob", officer.getDob())); 

     logger.info(count +" Rows affected in tblOfficers"); 



    }catch(Exception e){ 

     logger.info(e.getMessage()); 
    } 


} 

Officers.java

/** * */

import java.util.Date; 

public class Officers { 

    private String userName; 
    private String password; 
    private String password2; 
    private String fName; 
    private String lName; 
    private String oName; 
    private int divisionNo; 
    private int positionId; 
    private String emailAdd; 
    private Date startDate; 
    private Date endDate; 
    private String genderId; 
    private String phoneNo; 
    private Date dob; 
    /** 
    * No args constructor 
    */ 
    public Officers() { 
    } 
    /** 
    * @param userName 
    * @param password 
    * @param fName 
    * @param lName 
    * @param oName 
    * @param divisionNo 
    * @param positionId 
    * @param emailAdd 
    * @param startDate 
    * @param endDate 
    * @param genderId 
    * @param phoneNo 
    * @param dob 
    */ 
    public Officers(String userName, String password, String fName, String lName, 
      String oName, int divisionNo, int positionId, String emailAdd, 
      Date startDate, Date endDate, String genderId, String phoneNo, 
      Date dob) { 
     this.userName = userName; 
     this.password = password; 
     this.fName = fName; 
     this.lName = lName; 
     this.oName = oName; 
     this.divisionNo = divisionNo; 
     this.positionId = positionId; 
     this.emailAdd = emailAdd; 
     this.startDate = startDate; 
     this.endDate = endDate; 
     this.genderId = genderId; 
     this.phoneNo = phoneNo; 
     this.dob = dob; 
    } 
    /** 
    * @return the BadgeNo 
    */ 
    public String getUserName() { 
     return userName; 
    } 
    /** 
    * @param badgeNo the BadgeNo to set 
    */ 
    public void setUserName(String userName) { 
     this.userName = userName; 
    } 
    /** 
    * @return the Password 
    */ 
    public String getPassword() { 
     return password; 
    } 
    /** 
    * @param password the Password to set 
    */ 
    public void setPassword(String password) { 
     this.password = password; 
    } 
    /** 
    * @return the First Name 
    */ 
    public String getfName() { 
     return fName; 
    } 
    /** 
    * @param fName the First Name to set 
    */ 
    public void setfName(String fName) { 
     this.fName = fName; 
    } 
    /** 
    * @return the Last Name 
    */ 
    public String getlName() { 
     return lName; 
    } 
    /** 
    * @param lName the Last Name to set 
    */ 
    public void setlName(String lName) { 
     this.lName = lName; 
    } 
    /** 
    * @return the Other Name 
    */ 
    public String getoName() { 
     return oName; 
    } 
    /** 
    * @param oName the Other Name to set 
    */ 
    public void setoName(String oName) { 
     this.oName = oName; 
    } 
    /** 
    * @return the DivisionNo 
    */ 
    public int getDivisionNo() { 
     return divisionNo; 
    } 
    /** 
    * @param divisionNo the DivisionNo to set 
    */ 
    public void setDivisionNo(int divisionNo) { 
     this.divisionNo = divisionNo; 
    } 
    /** 
    * @return the PositionId 
    */ 
    public int getPositionId() { 
     return positionId; 
    } 
    /** 
    * @param positionId the PositionId to set 
    */ 
    public void setPositionId(int positionId) { 
     this.positionId = positionId; 
    } 
    /** 
    * @return the Email Address 
    */ 
    public String getEmailAdd() { 
     return emailAdd; 
    } 
    /** 
    * @param emailAdd the Email Address to set 
    */ 
    public void setEmailAdd(String emailAdd) { 
     this.emailAdd = emailAdd; 
    } 
    /** 
    * @return the Start Date 
    */ 
    public Date getStartDate() { 
     return startDate; 
    } 
    /** 
    * @param startDate the Start Date to set 
    */ 
    public void setStartDate(Date startDate) { 
     this.startDate = startDate; 
    } 
    /** 
    * @return the End Date 
    */ 
    public Date getEndDate() { 
     return endDate; 
    } 
    /** 
    * @param endDate the End Date to set 
    */ 
    public void setEndDate(Date endDate) { 
     this.endDate = endDate; 
    } 
    /** 
    * @return the GenderId 
    */ 
    public String getGenderId() { 
     return genderId; 
    } 
    /** 
    * @param genderId the GenderId to set 
    */ 
    public void setGenderId(String genderId) { 
     this.genderId = genderId; 
    } 
    /** 
    * @return the Phone Number 
    */ 
    public String getPhoneNo() { 
     return phoneNo; 
    } 
    /** 
    * @param phoneNo the Phone Number to set 
    */ 
    public void setPhoneNo(String phoneNo) { 
     this.phoneNo = phoneNo; 
    } 
    /** 
    * @return the Date Of Birth 
    */ 
    public Date getDob() { 
     return dob; 
    } 
    /** 
    * @param dob the Date Of Birth to set 
    */ 
    public void setDob(Date dob) { 
     this.dob = dob; 
    } 
    /** 
    * @return the password2 
    */ 
    public String getPassword2() { 
     return password2; 
    } 
    /** 
    * @param password2 the password2 to set 
    */ 
    public void setPassword2(String password2) { 
     this.password2 = password2; 
    } 


} 

更新錯誤日誌

57818 [http-8084-3] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 
57820 [http-8084-3] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource 
57820 [http-8084-3] DEBUG org.springframework.jdbc.support.SQLErrorCodesFactory - Database product name cached for DataSource [[email protected]]: name is 'MySQL' 
57824 [http-8084-3] DEBUG org.springframework.jdbc.support.SQLErrorCodesFactory - SQL error codes for 'MySQL' found 
57825 [http-8084-3] DEBUG org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator - Unable to translate SQLException with Error code '0', will now try the fallback translator 
57825 [http-8084-3] DEBUG org.springframework.jdbc.support.SQLStateSQLExceptionTranslator - Extracted SQL state class 'S1' from value 'S1009' 
57825 [http-8084-3] ERROR com.crimetrack.jdbc.JdbcOfficersDAO - Could not save officer 
org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [INSERT INTO crimetrack.tblofficers (userName,password, fName, lName, oName, divisionNo, poisitionId, emailAdd, startDate, endDate, genderId, phoneNo, dob) VALUES (:userName,:password, :fName, :lName, :oName, :divisionNo, :poisitionId, :emailAdd, :startDate, :endDate, :genderId, :phoneNo, :dob)]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:107) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876) 
    at com.crimetrack.jdbc.JdbcOfficersDAO.saveOfficer(JdbcOfficersDAO.java:113) 
    at com.crimetrack.service.OfficerManager.RegisterOfficer(OfficerManager.java:21) 
    at com.crimetrack.web.OfficerRegistrationController.handleRequest(OfficerRegistrationController.java:147) 
    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:213) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.sql.SQLException: Invalid argument value: java.io.NotSerializableException 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) 
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3359) 
    at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3010) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:229) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144) 
    at org.springframework.jdbc.core.ArgPreparedStatementSetter.doSetValue(ArgPreparedStatementSetter.java:65) 
    at org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:46) 
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:816) 
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:1) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) 
    ... 34 more 
57826 [http-8084-3] DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - Method [handleRequest] returned [ModelAndView: reference to view with name 'officer_registration'; model is null] 
57827 [http-8084-3] DEBUG org.springframework.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'officer_registration'; URL [/WEB-INF/jsp/officer_registration.jsp]] in DispatcherServlet with name 'crimetrack' 
+0

更新了 – devdar

+0

當你說官員的定義是否指你的xml定義?如果是這樣我沒有一個xml定義的官員,我需要創建一個它看起來像什麼 – devdar

+0

也許與http://stackoverflow.com/questions/20424989/jdbctemplate-in-search-not-working-properly – Gray

回答

1

這是兩件事情的結合,可以幫我解決這個問題:

public void saveOfficer(Officers officer) { 
     logger.info("In saveOfficer"); 

     int count = getJdbcTemplate().update("INSERT INTO crimetrack.tblofficers (userName,password, fName, lName, oName, divisionNo, positionId, emailAdd, startDate, endDate, genderId,phoneNo, dob,badgeNo) "+ 
               "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)" 
               , new Object[]{officer.getUserName(),StringSecurity.EncryptString(officer.getPassword()),officer.getfName(), 
               officer.getlName(),officer.getoName(),officer.getDivisionNo(),officer.getPositionId(), 
               officer.getEmailAdd(),officer.getStartDate(),officer.getEndDate(),officer.getGenderId(), 
               officer.getPhoneNo(),officer.getDob(),officer.getBadgeNo()}); 

     logger.info(count +" Rows affected in tblOfficers");    

    } 

和我列爲@Visher類表示

public class Officers implements Serializable{ 
1

除了捕捉可能發生在你的代碼塊每一個例外,你只是打印出所引發,所以你正在失去堆棧跟蹤異常的消息這導致你到你的例外的起源。

由於Spring只是拋出了RuntimeException(s),您可以刪除異常處理並查看堆棧跟蹤,它會告訴您更多關於該對象不可序列化的信息。作爲替代方案,假設您使用的是log4j,則可以用logger.error("Could not save officer.", e);替換異常處理中的語句logger.info(e.getMessage());。它會告訴你更多關於錯誤的信息,而不僅僅是包裝異常的消息。

查看您的代碼導致此異常的候選人可以是Officers類。你是否試圖將它存儲在會話中?

+0

新的錯誤日誌發佈 – devdar

+0

不,我不是試圖將它存儲在會話 – devdar

2

嘗試添加實現Serializable到人員類。現在它的所有內容都是可序列化的,如果這是造成問題的類,這將修復它。

添加到響應,因爲沒有幫助OP,但通常會導致不可序列化的異常,因爲該對象未標記爲可序列化。

剛剛在代碼中注意到你的sql正在使用'poisitionId',但你的addValue正在使用'positionId'。也許這種不匹配導致你的問題?

+0

我得到相同的錯誤 – devdar

+0

更新的答覆與另一個嘗試解決這個問題。 – Mikezx6r

+1

實際上問題不在於字段名稱的拼寫,因爲數據庫具有相同的拼寫。我重寫了getJdbcTemplate()。update(「insert into ... values(?,?,?...),new object [] {officer.getUserName}」,並且它對我很有用。聲明本身,謝謝你指出錯誤,因爲我也做了修正以及 – devdar

0
public class Officers implements Serializable { 
+0

如果你解釋爲什麼你的答案可以解決他們的問題,它可能會有幫助 – RobV

+0

這沒有效果錯誤日誌已更新 – devdar

14

是否使用JdbcTemplate(而不是SimpleJdbcTemplate這是不建議使用)或NamedParameterJdbcTemplate

僅在SimpleJdbcTemplateNamedParameterJdbcTemplate中支持命名參數。

2

嗨,我有同樣的問題,你。

我目前使用的是spring 3.2,它看起來像在這個版本中,你必須使用類NamedParameterJdbcTemplate而不是JdbcTemplate。這樣做解決了我的問題。

如果您是從JdbcDaoSupport進行擴展,請使用NamedParameterJdbcDaoSupport而不是這個。在這個類,你同時擁有一個JdbcTemplate和NamedParameterJdbcTemplate的

+0

爲什麼NamedParameterJdbcTemplate而不是JdbcTemplate?請更新您的答案並提供更多信息。 – adamdunson