[英]Jooq custom type with MockResult throwing DataTypeException
尝试使用具有自定义类型(Joda时间)的Jooq模拟来设置单元测试时出错。 我已经在代码生成过程中注册了一个转换器。 Jooq几乎找不到/看不到该转换器,并试图依靠ConvertAll
,这是行不通的。
查询模拟结果将引发异常(如下)。
转换器:
import org.joda.time.DateTime;
import java.sql.Timestamp;
import org.joda.time.DateTimeZone;
import org.jooq.Converter;
public class DateTimeConverter implements Converter<Timestamp, DateTime> {
@Override
public DateTime from(Timestamp databaseObject) {
return new DateTime(databaseObject.getTime()).withZone(DateTimeZone.UTC);
}
@Override
public Timestamp to(DateTime userObject) {
return new Timestamp(userObject.getMillis());
}
@Override
public Class<Timestamp> fromType() {
return Timestamp.class;
}
@Override
public Class<DateTime> toType() {
return DateTime.class;
}
}
该类已成功生成:
/**
* This class is generated by jOOQ
*/
package redacted.generated.jooq.tables;
/**
* This class is generated by jOOQ.
*/
@javax.annotation.Generated(value = {"http://www.jooq.org", "3.0.0"},
comments = "This class is generated by jOOQ")
@java.lang.SuppressWarnings({ "all", "unchecked" })
public class Bug extends org.jooq.impl.TableImpl<redacted.generated.jooq.tables.records.BugRecord> {
private static final long serialVersionUID = 1992533553;
/**
* The singleton instance of <code>public.bug</code>
*/
public static final redacted.generated.jooq.tables.Bug BUG = new redacted.generated.jooq.tables.Bug();
/**
* The class holding records for this type
*/
@Override
public java.lang.Class<redacted.generated.jooq.tables.records.BugRecord> getRecordType() {
return redacted.generated.jooq.tables.records.BugRecord.class;
}
/**
* The column <code>public.bug.testdate</code>.
*/
public final org.jooq.TableField<redacted.generated.jooq.tables.records.BugRecord, org.joda.time.DateTime> TESTDATE = createField("testdate", org.jooq.impl.SQLDataType.TIMESTAMP.asConvertedDataType(new name.benjaminAbbitt.jooqJodaTime.DateTimeConverter()), this);
/**
* The column <code>public.bug.id</code>.
*/
public final org.jooq.TableField<redacted.generated.jooq.tables.records.BugRecord, java.lang.Integer> ID = createField("id", org.jooq.impl.SQLDataType.INTEGER, this);
/**
* Create a <code>public.bug</code> table reference
*/
public Bug() {
super("bug", redacted.generated.jooq.Public.PUBLIC);
}
/**
* Create an aliased <code>public.bug</code> table reference
*/
public Bug(java.lang.String alias) {
super(alias, redacted.generated.jooq.Public.PUBLIC, redacted.generated.jooq.tables.Bug.BUG);
}
/**
* {@inheritDoc}
*/
@Override
public org.jooq.Identity<redacted.generated.jooq.tables.records.BugRecord, java.lang.Integer> getIdentity() {
return redacted.generated.jooq.Keys.IDENTITY_BUG;
}
/**
* {@inheritDoc}
*/
@Override
public java.util.List<org.jooq.UniqueKey<redacted.generated.jooq.tables.records.BugRecord>> getKeys() {
return java.util.Arrays.<org.jooq.UniqueKey<redacted.generated.jooq.tables.records.BugRecord>>asList(redacted.generated.jooq.Keys.BUG_ID_KEY);
}
/**
* {@inheritDoc}
*/
@Override
public redacted.generated.jooq.tables.Bug as(java.lang.String alias) {
return new redacted.generated.jooq.tables.Bug(alias);
}
}
例外是:
org.jooq.exception.DataTypeException: Cannot convert from 2014-03-05T17:57:24.668Z (class org.joda.time.DateTime) to class java.sql.Timestamp
at org.jooq.tools.Convert$ConvertAll.fail(Convert.java:809)
at org.jooq.tools.Convert$ConvertAll.from(Convert.java:747)
at org.jooq.tools.Convert.convert0(Convert.java:296)
at org.jooq.tools.Convert.convert(Convert.java:288)
at org.jooq.tools.Convert.convert(Convert.java:349)
at org.jooq.impl.AbstractRecord.getValue(AbstractRecord.java:219)
at org.jooq.tools.jdbc.MockResultSet.getValue(MockResultSet.java:383)
at org.jooq.tools.jdbc.MockResultSet.getTimestamp(MockResultSet.java:566)
at org.jooq.impl.Utils.getTimestamp(Utils.java:2195)
at org.jooq.impl.Utils.getFromResultSet(Utils.java:1952)
at org.jooq.impl.Utils.getFromResultSet(Utils.java:1881)
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(CursorImpl.java:1464)
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1447)
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1439)
at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:119)
at org.jooq.impl.CursorImpl$CursorIterator.fetchOne(CursorImpl.java:1412)
at org.jooq.impl.CursorImpl$CursorIterator.next(CursorImpl.java:1389)
at org.jooq.impl.CursorImpl$CursorIterator.next(CursorImpl.java:1353)
at org.jooq.impl.CursorImpl.fetch(CursorImpl.java:202)
at org.jooq.impl.CursorImpl.fetch(CursorImpl.java:176)
at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:268)
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:321)
at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:324)
at org.jooq.impl.SelectImpl.fetch(SelectImpl.java:1034)
at org.jooq.ResultQuery$fetch.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
at redacted.bug.BugTest.getTest(BugTest.groovy:47)
BugTest.groovy:
public class BugTest {
@Test
public void getTest() {
DSLContext testContext = setupDSL(new MockDataProvider() {
@Override
public MockResult[] execute(MockExecuteContext ctx) throws SQLException {
DSLContext create = DSL.using(SQLDialect.POSTGRES)
def result = create.newResult(BUG)
result.add(create.newRecord(BUG, [id: 0, testdate: new DateTime()]))
[new MockResult(result.size(), result)]
}
})
testContext.select().from(BUG).fetch() //this line fails
}
private DSLContext setupDSL(MockDataProvider provider) {
MockConnection connection = new MockConnection(provider)
return DSL.using(connection, SQLDialect.POSTGRES)
}
}
这是错误#5771 。 从jOOQ 3.9.0开始,在通过JDBC API公开之前, MockResultSet
不会使用转换器将用户定义类型<U>
( DateTime
)还原为JDBC /数据库类型<T>
( Timestamp
)。 如果不使用转换器,jOOQ不知道如何执行此转换,因此是一个例外。
<U>
( DateTime
)值创建结果。 MockResultSet
使用您的转换器将<U>
转换为<T>
( Timestamp
),然后再将该值通过JDBC API传递 ResultQuery
从JDBC API获取<T>
<T>
转换回<U>
目前,您不应在MockResult
放置任何用户定义的类型,而应仅使用JDBC Timestamp
类型(并且不生成引用用户定义类型的列)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.