gpt4 book ai didi

java - 尝试使用 Maven 在 JOOQ 中实现 EnumConverter 时出错

转载 作者:行者123 更新时间:2023-11-30 05:30:06 25 4
gpt4 key购买 nike

我无法找到完整的示例,因此我认为我在某处遗漏了一部分。我收到一条映射错误消息,特别是“将记录映射到类时发生错误...”。

我的枚举:

public enum CustomType {
CustomType(1, "some text"),
CustomType(2, "another");

private int id;
private String value;

private CustomType(int id, String value) {
this.id = id;
this.value = value;
}

public String toString() {
return name;
}

public int getValue() {
return value;
}
}

我的枚举转换器:

public class CustomTypeConverter extends EnumConverter<Integer, CustomType>
{
public CustomTypeConverter() {
super(Integer.class, CustomType.class);
}
}

我的POJO是:

public class MyPojo {
private CustomType customType;

public MyPojo(CustomType customType) {
this.customType = customType;
}

// setter/getter
}

据我了解,转换器链接可以在配置文件、maven 中以编程方式完成。我更喜欢在 Maven 中进行。

我的pom.xml

...
<plugins>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbc>
<url>${db.url}</url>
<user>${db.username}</user>
</jdbc>
<generator>
<database>
<includes>.*</includes>
<inputSchema>mySchema</inputSchema>
<customTypes>
<customType>
<name>com.myPackage.enum.CustomType</name>
<converter>com.myPackage.converters.CustomTypeConverter</converter>
</customType>
</customTypes>
<forcedTypes>
<forcedType>
<name>com.myPackage.data.MyPojo</name>
<expression>.*\custom_type</expression>
<types>.*</types>
</forcedType>
</forcedTypes>
</database>
<target>
<packageName>com.myPackage</packageName>
<directory>target/generated-sources/jooq</directory>
</target>
</generator>
</configuration>
</plugin>
</plugins>
...

如果这有帮助,数据库列的数据库更改日志是:

<column name="custom_type" type="INT">

选择代码是:

public List<MyPojo> getPojos(long id) {
return dslContext
.selectFrom(MY_POJO)
.where(MY_POJO.ID.eq(id))
.fetchInto(MyPojo.class);
}

最佳答案

这里有几个可能的问题:

您的枚举转换器不正确

jOOQ 内置 EnumConverter 只能在 "ordinals"<-> enum 或 "names"<-> enum 之间转换,ordinaly 对应于 Enum::ordinal 名称对应于 Enum::name 。在您的示例中,您已向枚举添加了类似“标签”的内容:

CustomTypeA(1, "some text"),
CustomTypeB(2, "another");

我假设您的实际枚举并不都命名为 CustomType ,这在 Java 中是不可能的,所以我添加了 AB后缀。通过这些枚举,jOOQ 的 EnumConverter 现在可以映射0 <-> CustomTypeA1 <-> CustomTypeB ,或'CustomTypeA' <-> CustomTypeA'CustomTypeB' <-> CustomTypeB

我想您会希望 jOOQ 将您的数据库值映射到您的 idvalue字符串,但 jOOQ 确实没有任何自动方法可以发现这就是您可能的意思。

您的代码生成器配置不正确

您的MyPojo class 不是您想要应用于特定列的类,它是您用来包装记录的包装类型,而不是单个

您可能想要配置的是:

<forcedType>
<userType>com.myPackage.enums.CustomType</userType>
<converter>com.myPackage.converters.CustomTypeConverter</converter>
<expression>.*\custom_type</expression>
<types>.*</types>
</forcedType>

您正在选择所有列,并尝试将它们映射到 POJO

最后,您的 POJO 没有默认构造函数,因此被 jOOQ 视为不可变的 POJO。这意味着 jOOQ 将按照投影顺序(您的 SELECT 子句)将列映射到构造函数参数上。您的构造函数只有一个参数,但您要从表中选择所有列。源列和目标列之间很可能也不匹配。

关于java - 尝试使用 Maven 在 JOOQ 中实现 EnumConverter 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com