3

Tomcat6とPostgresql8.4を使用しています。私のコードは次のようになります。

try {
  // Prepared statement inserting something...
} catch (final PSQLException e) {
  LOG.log(Level.SEVERE, "Saving failed.", e);
} catch (final SQLException e) {
  LOG.log(Level.SEVERE, "Saving failed (SQL).", e);
}

このDBへの挿入により、最初のでキャッチしたいPSQLException(たとえば、一意のキー違反)が発生する可能性がありますcatch。しかし、私が実際にログで見つけたのはこれです:

SEVERE: Saving failed (SQL).
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "UZIVATELIA_U_LOGIN"
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at cz.ecoremedia.realpad.web.backend.Users.saveNewUser(Users.java:119)
    at cz.ecoremedia.realpad.web.backend.Users.saveUser(Users.java:237)
    at org.apache.jsp.User_jsp._jspService(User_jsp.java:159)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    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(Thread.java:662)

キャッチしたタイプを確認するとe、たとえば次のようになります。

} catch (final SQLException e) {
  LOG.log(Level.SEVERE, e.getClass().getName());
  LOG.log(Level.SEVERE, "Saving failed (SQL).", e);

それはまだ私にそれがあったことを教えてくれますorg.postgresql.util.PSQLException

Eclipseでこれをローカルで試すと、完全に機能します。最初のブロックPSQLExceptionで正しくキャッチされます。catch

問題を正しく理解していれば、実際にスローされるorg.postgresql.util.PSQLExceptionクラスとは異なるクラスをキャッチします。org.postgresql.util.PSQLExceptionこれはどのように可能ですか?私は何が間違っているのですか?

あなたのアイデアをありがとう。

4

1 に答える 1

1

結局のところ、Tomcat のlib/フォルダーに別の JDBC ドライバーがありましたWEB-INF/lib/。Tomcatのものを削除すると、問題が解決しました。

(はい、それは別のクラスローダーの問題でした。@NathanHughes に感謝します。)

于 2012-05-25T15:28:08.603 に答える