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.
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:
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.