Java 自定义SqlErrorCodes
我面临一个小问题——定制Oracle DB错误代码 我认为可以通过以下方式映射我的错误代码:Java 自定义SqlErrorCodes,java,spring,Java,Spring,我面临一个小问题——定制Oracle DB错误代码 我认为可以通过以下方式映射我的错误代码: 添加“CustomSqlErrorCodeTranslation” 添加注册“CustomSqlErrorCodeTranslation”的“SQLErrorCodes” 添加“SQLErrorCodeSQLExceptionTranslator”,并设置我的“SqlErrorCodes” 并使用DI获取“SQLErrorCodeSqlExceptionTranslator”对象, 调用方法tran
- 添加“CustomSqlErrorCodeTranslation”
- 添加注册“CustomSqlErrorCodeTranslation”的“SQLErrorCodes”
- 添加“SQLErrorCodeSQLExceptionTranslator”,并设置我的“SqlErrorCodes”
<bean id="sqlExceptionTranslator" class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
<property name="sqlErrorCodes" ref="OracleSqlErrorCodes" />
</bean>
<bean id="OracleSqlErrorCodes" class="org.springframework.jdbc.support.SQLErrorCodes">
<property name="badSqlGrammarCodes">
<value>900,903,904,917,936,942,17006</value>
</property>
<property name="invalidResultSetAccessCodes">
<value>17003</value>
</property>
<property name="duplicateKeyCodes">
<value>1</value>
</property>
<property name="dataIntegrityViolationCodes">
<value>1400,1722,2291,2292</value>
</property>
<property name="dataAccessResourceFailureCodes">
<value>17002,17447</value>
</property>
<property name="cannotAcquireLockCodes">
<value>54</value>
</property>
<property name="cannotSerializeTransactionCodes">
<value>8177</value>
</property>
<property name="deadlockLoserCodes">
<value>60</value>
</property>
<property name="customTranslations">
<list>
<bean id="oracleCustomTranslations" class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation">
<property name="errorCodes" value="12899" />
<property name="exceptionClass" value="com.musicovery.bookervery.db.exception.SampleException" />
</bean>
</list>
</property>
</bean>
运行该代码时,将显示
无论是否添加了错误映射代码,都没有区别
将值过长的数据插入Oracle DB时,返回错误代码12899
Caused by: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
我想将12899错误代码映射到特定的异常类
有什么想法吗
提前谢谢
此外,我很抱歉我的英语不好
以下内容将定期附加,以帮助您找到正确答案 ///////////////////////////////// 样本例外 /////////////////////////////////
package com.musicovery.bookervery.db.exception;
import org.springframework.dao.DataAccessException;
public class SampleException extends DataAccessException{
private static final long serialVersionUID = 1L;
public SampleException(String msg, Throwable cause) {
super(msg, cause);
System.out.println("SampleException initialized");
}
}
///////////////////////////////// 编辑-打印堆栈跟踪 /////////////////////////////////
org.springframework.jdbc.UncategorizedSQLException: task? what is it?; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
### The error may involve com.musicovery.bookervery.dao.MemberDao.addMember-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; uncategorized SQLException for SQL []; SQL state [72000]; error code [12899]; ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; nested exception is java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; nested exception is java.sql.SQLException: org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
### The error may involve com.musicovery.bookervery.dao.MemberDao.addMember-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; uncategorized SQLException for SQL []; SQL state [72000]; error code [12899]; ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; nested exception is java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at com.musicovery.bookervery.serviceTest.MemberServiceTest.addMemberWithLongValue(MemberServiceTest.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:21)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.sql.SQLException: org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
### The error may involve com.musicovery.bookervery.dao.MemberDao.addMember-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; uncategorized SQLException for SQL []; SQL state [72000]; error code [12899]; ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; nested exception is java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
at com.musicovery.bookervery.serviceTest.MemberServiceTest.addMemberWithLongValue(MemberServiceTest.java:85)
... 30 more
Caused by: org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
### The error may involve com.musicovery.bookervery.dao.MemberDao.addMember-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; uncategorized SQLException for SQL []; SQL state [72000]; error code [12899]; ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
; nested exception is java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:346)
at com.sun.proxy.$Proxy14.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:231)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:59)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38)
at com.sun.proxy.$Proxy18.addMember(Unknown Source)
at com.musicovery.bookervery.service.MemberServiceImpl.addMember(MemberServiceImpl.java:17)
at com.musicovery.bookervery.serviceTest.MemberServiceTest.addMemberWithLongValue(MemberServiceTest.java:82)
... 30 more
Caused by: java.sql.SQLException: ORA-12899: value too large for column "MUSICOVERY"."MEMBERS"."NAME" (actual: 54, maximum: 12)
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:953)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3488)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:22)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:88)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:43)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:121)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:110)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:338)
... 37 more
我检查了异常的错误代码
SQLException sqlEx = new SQLException(e);
System.out.println("sqlEx error code : " + sqlEx.getErrorCode());
控制台:
sqlEx error code : 0
为什么是0?应该是12899
我和MyBatis一起发展。我读了报纸 API似乎没有引发任何异常。所以我猜sql错误代码是0
请告诉我您想要的任何来源,我将编辑这篇文章。问题已解决 我把错误的异常传递给了翻译
SQLException sqlEx = new SQLException(e);
应该是
SQLException sqlEx = (SQLException)e.getCause();
// System.out.println("exception code : " + sqlEx.getErrorCode());
您可能可以从org.springframework.jdbc.uncategorizedsqleexception进行扩展,并为“ValueTooLarge”创建一个异常类。您是否可以尝试检查
dae
变量是否实际上是SampleException
的实例?我认为问题可能是当spring尝试实例化自定义异常时。是否可以在此处发布日志?否,“dae”不是“SampleException”的实例。“dae”来自org.springframework.jdbc.UncategorizedException。
SQLException sqlEx = (SQLException)e.getCause();
// System.out.println("exception code : " + sqlEx.getErrorCode());