spring jdbc 에 나타 난 java. io. NotSerializable Exception 해결

6437 단어 springjdbc
오늘 spring 3 의 jdbc 를 배 워 서 이 코드 를 썼 습 니 다.
    public Hello createHello(final Hello hello) {
        final String sql = "insert into crud_hello(name,age,money,at_work,icon,introduce,create_date)"
                + " values (?,?,?,?,?,?,now())";
        
        //Caused by: java.io.NotSerializableException: smartcrud.spring.models.crud.HelloDaoJdbcImpl$1
        //at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
        //at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        //at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:4267)
        
//        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(sql, new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection con)
                    throws SQLException {
                PreparedStatement ps = con.prepareStatement(sql);
                int z = 0;
                ps.setString(++z, hello.getName());
                ps.setInt(++z, hello.getAge());
                ps.setDouble(++z, hello.getMoney());
                ps.setBoolean(++z, hello.isAtWork());
                ps.setBytes(++z, hello.getIcon());
                ps.setString(++z, hello.getIntroduce());
                return ps;
            }
        }/*, keyHolder*/);
        
//        hello.setId(keyHolder.getKey().longValue());
        
        /*
        jdbcTemplate.update(sql, new PreparedStatementSetter(){
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {
                int z = 0;
                ps.setString(++z, hello.getName());
                ps.setInt(++z, hello.getAge());
                ps.setDouble(++z, hello.getMoney());
                ps.setBoolean(++z, hello.isAtWork());
                ps.setBytes(++z, hello.getIcon());
                ps.setString(++z, hello.getIntroduce());
            }});*/
        
        return hello;
    }

 
결과 실행 중 다음 과 같은 오류 가 발생 했 습 니 다.
 org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into crud_hello(name,age,money,at_work,icon,introduce,create_date) values (?,?,?,?,?,?,now())]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException     org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:107)     org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)     org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)     org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)     org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)     org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812)     org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868)     org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876)     smartcrud.spring.models.crud.HelloDaoJdbcImpl.createHello(HelloDaoJdbcImpl.java:32)
왜 Prepared Statement Creator 를 사용 하면 안 되 는 지 아래 의 Prepared Statement Setter 를 사용 하면 문제 가 없습니다.
XX 가 서열 화 되 지 않 은 것 처럼 보이 지만 제 실체 Hello 는 Serializable 인 터 페 이 스 를 실 현 했 습 니 다. 각종 검색 이 결과 가 없 었 습 니 다. 오늘 일어나 서 어디 에 문제 가 있 는 지 추적 하기 로 결 정 했 습 니 다.
log4j. properties 에 다음 설정 을 추가 합 니 다: log4j. logger. org. springframework. jdbc = TRACE
관찰 하 다
[09-29 10:33:16 DEBUG] Executing prepared SQL update [09-29 10:33:16 DEBUG] Executing prepared SQL statement [insert into crud_hello(name,age,money,at_work,icon,introduce,create_date) values (?,?,?,?,?,?,now())] [09-29 10:33:17 DEBUG] Fetching JDBC Connection from DataSource [09-29 10:33:17 TRACE] Setting SQL statement parameter value: column index 1, parameter value [smartcrud.spring.models.crud.HelloDaoJdbcImpl$1@12000a5], value class [smartcrud.spring.models.crud.HelloDaoJdbcImpl$1], SQL type unknown [09-29 10:33:17 DEBUG] Returning JDBC Connection to DataSource
첫 번 째 라 고요?자리 차지 문자 의 value 는 smartcrud. spring. models. crud. HelloDaoJdbcImpl $1 로 설정 되 어 있 으 며 형식 이 인식 되 지 않 습 니 다.근 데 내 가 분명히 설 치 했 는데.     ps.setString(++z, hello.getName());
String 타 입 인 데 어떻게 인식 이 안 돼 요?언뜻 보기 에는 이치 에 맞지 않 습 니 다. 컴 파일 된 class 파일 에서 smartcrud. spring. models. crud. HelloDaoJdbcImpl $1 이라는 물건 을 찾 았 습 니 다.
class 1   implements Prepared StatementCreator, OH 는 내 API 가 잘못 사용 되 었 다 는 것 을 문득 깨 달 았 다.jdbcTemplate. update (sql, new Prepared StatementCreator () 를 사용 합 니 다.
두 번 째 매개 변수 인 Prepared StatementCreator 는 기본적으로 sql 의 첫 번 째 자리 차지 문자 의 값 이 되 었 습 니 다. 정확 한 쓰 기 는 jdbcTemplate. update (new Prepared StatementCreator () 입 니 다.
 수 정 된 코드 는 다음 과 같 습 니 다.
@Repository public class HelloDaoJdbcImpl implements HelloDao {     @Autowired     private JdbcTemplate jdbcTemplate;     @Override     public Hello createHello(final Hello hello) {         final String sql = "insert into crud_hello(name,age,money,at_work,icon,introduce,create_date)"                 + " values (?,?,?,?,?,?,now())";         KeyHolder keyHolder = new GeneratedKeyHolder();         jdbcTemplate.update(/*sql, */new PreparedStatementCreator() {             @Override             public PreparedStatement createPreparedStatement(Connection con)                     throws SQLException {                 PreparedStatement ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);                 int z = 0;                 ps.setString(++z, hello.getName());                 ps.setInt(++z, hello.getAge());                 ps.setDouble(++z, hello.getMoney());                 ps.setBoolean(++z, hello.isAtWork());                 ps.setBytes(++z, hello.getIcon());                 ps.setString(++z, hello.getIntroduce());                 return ps;             }         }, keyHolder);         hello.setId(keyHolder.getKey().longValue());         return hello;     }
}

좋은 웹페이지 즐겨찾기