4

我正在使用 Spring 3.0.2,并且我有一个名为 MovieDAO 的类,它使用 JDBC 来处理数据库。我已经设置了@Repository 注释,我想将 SQLException 转换为 Spring 的 DataAccessException 我有以下示例:

   @Repository
    public class JDBCCommentDAO implements CommentDAO {

        static JDBCCommentDAO instance;
        ConnectionManager connectionManager;

        private JDBCCommentDAO() {
            connectionManager = new ConnectionManager("org.postgresql.Driver", "postgres", "postgres");
        }

        static public synchronized JDBCCommentDAO getInstance() {
            if (instance == null)
                instance = new JDBCCommentDAO();
            return instance;
        }

        @Override
        public Collection<Comment> getComments(User user) throws DAOException {
            Collection<Comment> comments = new ArrayList<Comment>();
            try {
                String query = "SELECT * FROM Comments WHERE Comments.userId = ?";
                Connection conn = connectionManager.getConnection();
                PreparedStatement stmt = conn.prepareStatement(query);
                stmt = conn.prepareStatement(query);
                stmt.setInt(1, user.getId());
                ResultSet result = stmt.executeQuery();
                while (result.next()) {
                    Movie movie = JDBCMovieDAO.getInstance().getLightMovie(result.getInt("movie"));
                    comments.add(new Comment(result.getString("text"), result.getInt("score"), user, result.getDate("date"), movie));
                }
                connectionManager.closeConnection(conn);
            } catch (SQLException e) {
                e.printStackTrace();
                        //CONVERT TO DATAACCESSEXCEPTION
            }
            return comments;
        }
}

我不知道如何获取 Translator,也不想扩展任何 Spring 类,因为这就是我使用 @Repository 注释的原因

4

3 回答 3

4

你必须提供一个 bean-post 处理器来实现你的目标

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

或者使用SQLExceptionSubclassTranslator

private SQLExceptionTranslator sqlExceptionTranslator = new SQLExceptionSubclassTranslator();

catch(SQLException e) {
    throw sqlExceptionTranslator.doTranslate("<WHICH_TASK>", "<WHICH_SQL_QUERY>", e);
}

反而

于 2010-05-09T01:15:22.750 回答
1

JDBC 不能很好地处理@Repository自动异常转换,因为SQLException它不是运行时异常。@Repository-style 异常转换仅适用于使用运行时异常的数据访问 API,例如 Hibernate 和 JPA。

Spring 上下文使用该@Repository注解来自动生成围绕 DAO 的代理包装器,并在抛出异常时对其进行转换。不过,这只适用于运行时异常。具体来说,如果您的 DAO 实现类方法 throw SQLException,那么您的接口方法签名也必须如此,代理包装器也必须如此,因此客户端代码必须处理该异常,这完全违背了异常转换的意义。

对于 JDBC,通常需要与 Spring API 进行一些耦合,或者通过扩展JdbcDaoSupport和使用getExceptionTranslator(),或者手动构建自己的SQLExceptionTranslator实例。无论哪种方式,您都需要SQLException在 DAO 内部捕获并将其转换为DataAccessException.

于 2010-05-09T11:25:34.893 回答
0

捕捉(SQLException e){

                    throw new DataAccessException("some message",e);
        }
于 2015-07-06T07:39:55.550 回答