es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La herramienta JOOQ codegen genera diferentes constructores de copia cuando se utilizan convertidores de tipos de datos personalizados.

Estoy utilizando jOOQ 3.15 y me enfrenté a un comportamiento extraño del generador.
El generador de código genera un constructor de copia ligeramente diferente para Records si se utiliza un conversor para tipos de datos personalizados. Estoy tratando de implementar la integración de org.joda.money.Money con nuestras entidades.

Algunos ejemplos de entidad:

create type pg_money as (
  amount numeric,
  currency varchar
);

create table test_money(
  id uuid primary key,
  money pg_money not null
);

Nuestro conversor personalizado:

class PostgresMoneyConverter : Converter<pgmoneyrecord, money=""> {
  override fun from(t: PgMoneyRecord): Money {
    return Money.of(CurrencyUnit.of(t.currency), t.amount)
  }

  override fun to(u: Money): PgMoneyRecord {
    return PgMoneyRecord(u.amount, u.currencyUnit.code)
  }

  override fun fromType(): Class<pgmoneyrecord> {
    return PgMoneyRecord::class.java
  }

  override fun toType(): Class<money> {
    return Money::class.java
  }
}

Constructor generado en TestMoneyRecord.kt:

constructor(value: by.ivasiuk.testmoney.model.tables.pojos.TestMoney?): this() {
  if (value != null) {
    this.id = value.id
    this.money = value.money?.let { Money(it) }
  }
}

El problema está en Money(it) porque Money no tiene tal constructor, solo con BigMoney como argumento. Y es interesante que si uso cualquier tipo de datos básico, incluso si no es primitivo, el generador de código pone simplemente this.money = value.money sin ningún constructor de copia.

Veo que en 3.16 hay algunos planes para personalizar la generación de constructores. ¿Hay alguna solución en 3.15 para no generar constructores en absoluto o forzar a que use this.money = value.money también?</pgmoneyrecord,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo un problema con jOOQ 3.15 que no genera correctamente el constructor de copia para tu tipo de dato personalizado. Parece que jOOQ 3.16 tiene planes de personalizar la generación de constructores, por lo que esa podría ser una solución potencial para ti.

    Mientras tanto, es posible que puedas obligar a jOOQ 3.15 a usar this.money = value.money mediante el uso de la anotación @Generated en el constructor. Esta anotación indicará a jOOQ que no genere el constructor y use el que has proporcionado.

Comments are closed.