JOOQ: how do I add an interface to a generated Record Class

醉酒当歌 提交于 2021-02-06 20:43:47

问题


I am generating a set of JOOQ records from a schema using JOOQ 3.6.4 with Java 8.

Some of the tables are reference data that are similarly structured, let's say they have ID, CODE and VALUE columns (they might have other columns, but they all have at least these columns).

In my code, not generated by JOOQ, I have an interface "ReferenceData" that defines accessors that match the code that JOOQ generates for these three columns. I want to tell JOOQ to add an "implements ReferenceData" clause to the Record objects it generates (the code that JOOQ already generates will automatically implement the interfaces).

I'm not asking that JOOQ automatically figure out the interfaces, I'm fine with listing what interfaces each table should implement in the XML configuration.

Question 1: is there any way to configure JOOQ to generate an implements clause without writing a custom generator class?

If I have to write a custom generator class - I still want the definition of what table records implements what interfaces to be in the XML config.

Question 2: Is there an example somewhere of defining custom data in the XML that is communicated down into the custom generator class?


回答1:


This can be done using

  • Generator strategies
  • Matcher strategies (which are built-in, XML-based generator strategies)

Generator strategy

With a generator strategy, you'll implement the following code:

public class MyStrategy extends DefaultGeneratorStrategy {
    @Override
    public List<String> getJavaClassImplements(Definition definition, Mode mode) {
        if (mode == Mode.RECORD && definition.getQualifiedName().matches("some regex")) {
            return Arrays.asList(MyCustomInterface.class.getName());
        }
    }
}

The above can then be hooked into your code generator configuration as such:

<generator>
  <strategy>
    <name>com.example.MyStrategy</name>
  </strategy>
</generator>

Matcher strategy

With a matcher strategy, you'll essentially write:

<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>A_REGEX_MATCHING_ALL_RELEVANT_TABLES</expression>
          <recordImplements>com.example.MyCustomInterface</recordImplements>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>

As you can see, matcher strategies are easier to configure than generator strategy, for simple use-cases like yours.



来源:https://stackoverflow.com/questions/33004232/jooq-how-do-i-add-an-interface-to-a-generated-record-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!