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