2012-10-04 12 views
7

Próbuję wstawić rekord do tabeli i pojawia się następujący błąd: Próbowałem również przy użyciu "?" dla parametrów w instrukcji SQL i otrzymałem ten sam błąd.Spring - Niepoprawna wartość argumentu: java.io.NotSerializableException

błąd

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; 
    } 


} 

Updated Error Log

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

Aktualizacja została wykonana – devdar

+0

kiedy mówisz, że definicja oficerów oznacza definicję xml? jeśli tak nie mam definicji xml dla oficerów, czy muszę utworzyć, jak by to wyglądało? – devdar

+0

Może być związane z http://stackoverflow.com/questions/20424989/jdbctemplate-in-search-not-working-properly – Gray

Odpowiedz

1

Było to połączenie dwóch rzeczy, które mi pomóc rozwiązać ten problem:

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");    

    } 

i od klasy I włączone jako @Visher wskazany

public class Officers implements Serializable{ 
1

Oprócz połowu każdy wyjątek, który może wystąpić w bloku kodu jesteś po prostu drukując komunikat wyjątku, który jest wyrzucany i tak jesteś utraty StackTrace który prowadzi do źródła twojego wyjątku.

Od wiosny po prostu rzuca RuntimeException(s) można usunąć obsługę wyjątków i spojrzeć na stacktrace, który powie więcej na temat obiektu, który nie jest możliwy do serializacji. Alternatywnie można zastąpić instrukcję logger.info(e.getMessage()); wewnątrz obsługi wyjątków przez logger.error("Could not save officer.", e); zakładając, że używasz log4j. Powie Ci więcej o błędzie niż tylko komunikat o wyjątku zawijania.

Patrząc na swój kod, kandydatem, który powoduje ten wyjątek, może być klasa Officers. Próbujesz zapisać go w sesji?

+0

Nowy dziennik błędów opublikowany – devdar

+0

nie próbuję go zapisać w sesji – devdar

2

Spróbuj dodać narzędzia Serializable do Oficerów. Wszystko, co jest w tym momencie, jest możliwe do serializacji, a jeśli to klasa, która jest przyczyną problemu, to to naprawi.

Dodanie do odpowiedzi, ponieważ nie pomogło OP, ale zwykle nie jest możliwy serializowalny wyjątek, ponieważ obiekt nie jest oznaczony jako Serializowalny.

Po prostu zauważyłem w kodzie, że twój sql używa "poisitionId", ale twoja wartość dodana używa "positionId". Być może to niedopasowanie powoduje problem?

+0

Otrzymuję ten sam błąd – devdar

+0

Zaktualizowana odpowiedź z kolejną próbą rozwiązania problemu. – Mikezx6r

+1

faktycznie problem nie występował w pisowni nazwy pola, ponieważ baza danych miała taką samą pisownię. Napisałem aktualizację getJdbcTemplate(). ("Wstaw do ... wartości (?,?,? ...), nowy obiekt [] {oficer.getUserName}" w ten sposób i zadziałało to dla mnie. instrukcja sama w sobie.Dziękuję za wskazanie błędu, ponieważ ja również go naprawić. – devdar

0
public class Officers implements Serializable { 
+0

To może pomóc OP, jeśli wyjaśnisz, dlaczego twoja odpowiedź rozwiązałaby ich problem. – RobV

+0

To nie działało. Aktualizacja protokołu błędu – devdar

14

Używasz JdbcTemplate (zamiast SimpleJdbcTemplate która jest nieaktualna) lub NamedParameterJdbcTemplate?

Nazwane parametry są obsługiwane tylko w SimpleJdbcTemplate i NamedParameterJdbcTemplate.

2

Witam, miałem ten sam problem, co ty.

Używam obecnie wersji 3.2 i wygląda na to, że w tej wersji trzeba użyć klasy NamedParameterJdbcTemplate zamiast JdbcTemplate. w ten sposób rozwiązuje mój problem.

jeśli korzystasz z JdbcDaoSupport, użyj NamedParameterJdbcDaoSupport zamiast tego.W tej klasie masz zarówno jdbcTemplate i NamedParameterJdbcTemplate

+0

Dlaczego NamedParameterJdbcTemplate działa zamiast JdbcTemplate? Zaktualizuj swoją odpowiedź, podając więcej informacji. – adamdunson

Powiązane problemy