spring jdbc 에 나타 난 java. io. NotSerializable Exception 해결
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; }
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.