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.

Clase abstracta de Spring con campos finales y herencia usando la anotación @SuperBuilder de Lombok.

Actualmente estoy tratando de eliminar parte del código base con lombok, pero tengo algunos problemas.

Tengo una clase abstracta llamada AbstractParent,

@SuperBuilder(toBuilder = true)
@EqualsAndHashCode
@ToString
@Getter
@Setter
public abstract class AbstractParent {
    private final field1;
    private final field2;
}

Luego tengo una clase hija como esta

@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public abstract class Child extends AbstractParent {
}

Y también tengo algunas clases que extienden la clase Child

@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Component
public abstract class ExtendedChild extends Child {
    private final field1;
    private final field2;
}

Dado que lombok no puede usar “super” en un constructor, intenté la anotación @SuperBuilder en lugar de definir los constructores manualmente, pero no logro que la aplicación se inicie. ¿Estoy omitiendo algo por completo? ¿Es esto incluso posible con lombok y Spring?

El error es:

APPLICATION FAILED TO START

Description:
Parameter 0 of constructor in com.fu.extendedChild required a bean of type 'com.fu.extendedChild$extendedChildBuilder' that could not be found.

Action:
Consider defining a bean of type 'com.fu.extendedChild$extendedChildBuilder' in your configuration.
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el constructor de la clase ExtendedChild. La anotación @SuperBuilder de Lombok genera una clase constructora que se utiliza para construir instancias de la clase. En este caso, el mensaje de error sugiere que Spring no puede encontrar un bean del tipo ‘com.fu.extendedChild$extendedChildBuilder’ para inyectar en el constructor de la clase ExtendedChild.

    Para resolver este problema, puedes definir manualmente un bean para la clase ExtendedChild en la configuración de Spring utilizando la anotación @Bean. Por ejemplo:

    @Configuration
    public class AppConfig {
    
        @Bean
        public ExtendedChild.ExtendedChildBuilder extendedChildBuilder() {
            return ExtendedChild.builder();
        }
    
        @Bean
        public ExtendedChild extendedChild() {
            return ExtendedChild.builder()
                    .field1("field1")
                    .field2("field2")
                    .build();
        }
    }
    

    Esto definirá un bean para ExtendedChildBuilder y un bean para una instancia de la clase ExtendedChild. El segundo bean utiliza ExtendedChildBuilder para construir una instancia de la clase ExtendedChild con algunos valores de ejemplo para field1 y field2. Puedes ajustar esta configuración según tus necesidades.

    Una vez que hayas definido el bean para la clase ExtendedChild, puedes inyectarlo en otros beans o utilizarlo en tu aplicación como de costumbre.

Comments are closed.