无法使用自定义生成器策略为 getter 个名称创建记录
Unable to create records using custom generator strategy for getter names
我正在使用 jOOQ 3.13.1,dropwizard 2.0.7。为了将 jOOQ 和 dropwizard 结合在一起,我使用了 (https://droptools.bendb.com/jooq/)。我正在使用自定义生成策略来为我的 setter 和 getters 维护驼峰式大小写。名字如期而至。
记录对象具有各自列的数据。但是,我不断从我的数据库中收到错误,我试图在非空列上设置“空”。
我仅在尝试创建新记录时才看到此问题。更新记录工作正常。
ERROR [2021-03-18 14:58:05,363] com.bendb.dropwizard.jooq.jersey.LoggingDataAccessExceptionMapper: Error handling a request: 9f65c0316d996ebb
! org.postgresql.util.PSQLException: ERROR: null value in column "createdAt" of relation "failures" violates not-null constraint
! Detail: Failing row contains (265, null, Some callback, User account not found, null, null, null).
如果我打印记录,它看起来像这样:
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
| id|userId|action |error |createdAt |updatedAt |status|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
|{null}|{null}|*Some callback|*User account not found|*2021-03-18 14:58:05,363|*2021-03-18 14:58:05,363|{null}|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
我的 getter 名字是:
“getId”、“getUserId”、“getAction”、“getError”、“getCreatedAt”、“getUpdatedAt”、“getStatus”。
对于小写的列,我没有发现任何问题。如果列名称采用 CamelCase 的地方出现此问题。
class 看起来像:
public class FailureDao {
private final DSLContext database;
public FailureDao(DSLContext database) {
this.database = database;
}
public void storeFailure(FailureRecord failure) {
database.newRecord(FAILURES, failure).store();
}
}
对于代码生成,我在此处遵循文档 https://www.jooq.org/doc/3.13/manual/code-generation/codegen-generatorstrategy/
我的生成器 class 看起来像:
public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
@Override
public String getJavaIdentifier(Definition definition) {
return definition.getOutputName().toUpperCase();
}
@Override
public String getJavaSetterName(Definition definition, Mode mode) {
return "set" + StringUtils.toUC(definition.getOutputName());
}
@Override
public String getJavaGetterName(Definition definition, Mode mode) {
return "get" + StringUtils.toUC(definition.getOutputName());
}
}
我发现了问题。原来,它在 https://groups.google.com/g/jooq-user/c/1iy0EdWe_T8/m/YN9PEsIF4lcJ 上有解释。我的解决方法是使用 jOOQ 生成的 POJO。要创建新记录,我现在传递的是 POJO class.
的对象,而不是传递 Record class 的对象
我正在使用 jOOQ 3.13.1,dropwizard 2.0.7。为了将 jOOQ 和 dropwizard 结合在一起,我使用了 (https://droptools.bendb.com/jooq/)。我正在使用自定义生成策略来为我的 setter 和 getters 维护驼峰式大小写。名字如期而至。
记录对象具有各自列的数据。但是,我不断从我的数据库中收到错误,我试图在非空列上设置“空”。
我仅在尝试创建新记录时才看到此问题。更新记录工作正常。
ERROR [2021-03-18 14:58:05,363] com.bendb.dropwizard.jooq.jersey.LoggingDataAccessExceptionMapper: Error handling a request: 9f65c0316d996ebb
! org.postgresql.util.PSQLException: ERROR: null value in column "createdAt" of relation "failures" violates not-null constraint
! Detail: Failing row contains (265, null, Some callback, User account not found, null, null, null).
如果我打印记录,它看起来像这样:
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
| id|userId|action |error |createdAt |updatedAt |status|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
|{null}|{null}|*Some callback|*User account not found|*2021-03-18 14:58:05,363|*2021-03-18 14:58:05,363|{null}|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
我的 getter 名字是: “getId”、“getUserId”、“getAction”、“getError”、“getCreatedAt”、“getUpdatedAt”、“getStatus”。
对于小写的列,我没有发现任何问题。如果列名称采用 CamelCase 的地方出现此问题。
class 看起来像:
public class FailureDao {
private final DSLContext database;
public FailureDao(DSLContext database) {
this.database = database;
}
public void storeFailure(FailureRecord failure) {
database.newRecord(FAILURES, failure).store();
}
}
对于代码生成,我在此处遵循文档 https://www.jooq.org/doc/3.13/manual/code-generation/codegen-generatorstrategy/
我的生成器 class 看起来像:
public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {
@Override
public String getJavaIdentifier(Definition definition) {
return definition.getOutputName().toUpperCase();
}
@Override
public String getJavaSetterName(Definition definition, Mode mode) {
return "set" + StringUtils.toUC(definition.getOutputName());
}
@Override
public String getJavaGetterName(Definition definition, Mode mode) {
return "get" + StringUtils.toUC(definition.getOutputName());
}
}
我发现了问题。原来,它在 https://groups.google.com/g/jooq-user/c/1iy0EdWe_T8/m/YN9PEsIF4lcJ 上有解释。我的解决方法是使用 jOOQ 生成的 POJO。要创建新记录,我现在传递的是 POJO class.
的对象,而不是传递 Record class 的对象