mapstruct / mapstruct/mapstruct

@SubclassMapping selecting implementation class based on source field value

Abierto
#3,365 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

feature
Lenguaje dominante
Java
Estrellas
7.7k
Forks
1.1k
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Use case

It is common practice saving multiple sub-classes into one database tables. E.g.:
I have a db entity Contact with type field value

@Entity
@Table(name = CONTACTS_TABLE)
open class ContactEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long = 0

    @Column(name = CONTACT_TYPE_COLUMN, nullable = false)
    var type: ContactType = ContactType.BUSINESS
}

My domain model Contact is abstract and can have two implementations: BusinessContact and NaturalPersonContact:

sealed interface Contact {
    val id: Long
}

data class BusinessContact(
    override val id: Long,
    val businessName: String,
) : Contact

data class NaturalPersonContact(
    override val id: Long,
    val firstName: String,
    val lastName: String,
) : Contact

Trying to define a Mapper with @SubclassMapping has no option to add logic to it based on type property:

    @SubclassMapping(target = BusinessContact::class, source = ContactEntity::class)
    @SubclassMapping(target = NaturalPersonContact::class, source = ContactEntity::class)
    fun entityToDomainModel(entity: ContactEntity): Contact
Generated Code

No response

Possible workarounds

None known

MapStruct Version

implementation("org.mapstruct:mapstruct:1.5.5.Final")

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comience examinando cómo se procesa @SubclassMapping para el mapper ContactEntity-to-Contact descrito en el issue, incluido el comportamiento de MapStruct 1.5.5.Final. La implementación debe permitir seleccionar BusinessContact o NaturalPersonContact a partir de la propiedad del tipo fuente e incluir cobertura para ese mapping generado.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
java, kotlin
Área
tooling
Tipo de issue
Nueva funcionalidad
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
30/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.