web-dev-qa-db-fra.com

Comment définir spring.main.allow-bean-definition-overriding sur true dans une configuration de démarrage Spring boot 2.1.0

Je maintiens un démarreur à démarrage à ressort qui personnalise les attributs d'erreur renvoyés lorsque, par exemple, un point de terminaison inconnu est appelé. Pour cela, remplacez le bean org.springframework.boot.web.servlet.error.ErrorAttributes.

Tout fonctionnait bien avec 2.0.6, mais 2.1.0 désactive le remplacement du bean par défaut , ce qui fait que le démarreur échoue maintenant avec le message suivant.

Définition de bean non valide avec le nom 'errorAttributes' défini dans la ressource de chemin de classe [com/mycompany/springboot/starter/config/ErrorsConfig.class]: Impossible d'enregistrer la définition de bean [Root bean: class [null]; portée =; abstrait = faux; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primaire = faux; factoryBeanName = com.mycompany.springboot.starter.config.ErrorsConfig; factoryMethodName = errorAttributes; initMethodName = null; destroyMethodName = (déduit); défini dans la ressource de chemin de classe [com/mycompany/springboot/starter/config/ErrorsConfig.class]] pour le bean 'errorAttributes': il y a déjà [Root bean: class [null]; portée =; abstrait = faux; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primaire = faux; factoryBeanName = org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; factoryMethodName = errorAttributes; initMethodName = null; destroyMethodName = (déduit); défini dans la ressource de chemin de classe [org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.class]] lié

Comme expliqué dans la documentation, la définition de true de la propriété spring.main.allow-bean-definition-overriding résout le problème. Ma question est de savoir comment faire cela dans le démarreur (je ne veux pas que les utilisateurs de mon démarreur aient à changer leur fichier application.properties, pour quelque chose qui est spécifique à mon entrée)?

J'ai essayé une annotation @PropertySource ("classpath: /com/mycompany/starter/application.properties") à ma @Configuration avec cette propriété définie dans ce fichier, mais cela ne fonctionne pas.

Qu'est-ce que je rate? Existe-t-il un moyen d'autoriser ma configuration à remplacer ce bean?

Voici le code source (simplifié) de la configuration:

@Configuration
@PropertySource("classpath:/com/mycompany/starter/application.properties")
public class ErrorsConfig {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Bean
    public ErrorAttributes errorAttributes() {
        return new DefaultErrorAttributes() {
            @SuppressWarnings("unchecked")
            @Override
            public Map<String, Object> getErrorAttributes(WebRequest request, boolean includeStackTrace) {
                Map<String, Object> errorAttributes = super.getErrorAttributes(request, includeStackTrace);
                // CustomeError is a (simplified) bean of the error attributes we should return.
                CustomError err = new CustomError("myErrorCode", (String) errorAttributes.get("error"));
                return OBJECT_MAPPER.convertValue(err, Map.class);
            }
        };
    }
}

et mon fichier de ressources com/mycompany/starter/application.properties contient

spring.main.allow-bean-definition-overriding = true

6
Jean-Marc Astesana

Le bean ErrorAttributes de Spring Boot est défini par ErrorMvcAutoConfiguration. Il est annoté avec @ConditionalOnMissingBean Il sera donc désactivé si un bean ErrorAttributes a déjà été défini. Comme le bean défini par votre classe ErrorsConfig tente de remplacer le bean ErrorAttributes de Boot plutôt que de le faire reculer, votre classe ErrorsConfig doit être traitée après le ErrorMvcAutoConfiguration classe. Cela signifie que vous avez un problème de commande dans votre démarreur.

L'ordre dans lequel les classes de configuration automatique sont traitées peut être contrôlé à l'aide de @AutoConfigureBefore Et @AutoConfigureAfter. En supposant que ErrorsConfig est lui-même une classe de configuration automatique enregistrée dans spring.factories, Vous pouvez résoudre votre problème en l'annotant avec @AutoConfigureBefore(ErrorMvcAutoConfiguration.class). Avec ce changement en place, ErrorsConfig définira son ErrorAttributes bean avant ErrorMvcAutoConfiguration tente de le faire, ce qui entraînera la configuration automatique du bean ErrorsAttribute de Boot à l'arrière-plan de.

9
Andy Wilkinson

vous pouvez coller cette commande"spring.main.allow-bean-definition-overriding=true" dans workspace/project/src/main/resources/applicationproperties éditez le fichier et collez la commande et exécutez votre projet en mode débogage.

1
Sai Kumar Reddy