2012-10-04 21 views
7

レコードをテーブルに挿入しようとしていて、次のエラーが発生しています。 "?" sqlステートメントのパラメータに対して同じエラーが発生しました。Spring - 無効な引数値: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

Officersクラスにシリアライズ可能な実装を追加してみてください。今はその中のすべてがシリアライズ可能です。それが問題の原因となっているクラスであれば、これで修正されます。

OPへの追加はOPの助けにはなりませんでしたが、通常、オブジェクトはSerializableとしてマークされていないため、シリアル化できない例外が発生します。

あなたのSQLが 'poisitionId'を使用していて、あなたのaddValueが 'positionId'を使用していることが、コードで分かりました。おそらく、この不一致があなたの問題を引き起こしていますか?

+0

同じエラーが発生しています – devdar

+0

別の解決方法を試して問題を解決しました。 – Mikezx6r

+1

実際には、データベースに同じスペルがあったため、問題はフィールド名のスペルがありませんでした。私はgetJdbcTemplate()。update( "insert into ... values(?、?、?...))、新しいオブジェクト[] {officer.getUserName}"を書きました。 – devdar

0
public class Officers implements Serializable { 
+0

答えが問題を解決する理由を説明するとOPに役立つかもしれません – RobV

+0

これはうまくいかないエラーログ – devdar

14

ます(推奨されません代わりにSimpleJdbcTemplateの)JdbcTemplateまたはNamedParameterJdbcTemplateを使用していますか?

名前付きパラメータはSimpleJdbcTemplateおよびNamedParameterJdbcTemplateでのみサポートされています。

2

こんにちは私はあなたと同じ問題を抱えていました。

私は現在Spring 3.2を使用しています。このバージョンでは、JdbcTemplateの代わりにNamedParameterJdbcTemplateクラスを使用する必要があります。これを行うことで私の問題が解決されます。

JdbcDaoSupportから拡張する場合は、この代わりにNamedParameterJdbcDaoSupportを使用してください。このクラスでは、あなたは持っているjdbcTemplateとNamedParameterJdbcTemplate両方

+0

なぜJdbcTemplateの代わりにNamedParameterJdbcTemplateが機能するのですか? – adamdunson