wake-up-neo.com

So setzen Sie spring.main.allow-bean-definition-overriding in einer Starterkonfiguration für Spring Boot 2.1.0 auf true

Ich verwalte einen Spring-Boot-Starter, der die zurückgegebenen Fehlerattribute anpasst, wenn beispielsweise ein unbekannter Endpunkt aufgerufen wird. Dies erfolgt durch Überschreiben der Bean org.springframework.boot.web.servlet.error.ErrorAttributes.

Alles funktionierte gut mit 2.0.6, aber 2.1.0 deaktiviert standardmäßig das Überschreiben von Beans , sodass der Starter jetzt mit der folgenden Meldung fehlschlägt.

Ungültige Bean-Definition mit dem Namen 'errorAttributes' in der Klassenpfadressource [com/mycompany/springboot/starter/config/ErrorsConfig.class] definiert: Bean-Definition kann nicht registriert werden [Root-Bean: class [null]; scope =; abstrakt = falsch; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primär = falsch; factoryBeanName = com.mycompany.springboot.starter.config.ErrorsConfig; factoryMethodName = errorAttributes; initMethodName = null; destroyMethodName = (abgeleitet); definiert in Klassenpfadressource [com/mycompany/springboot/starter/config/ErrorsConfig.class]] für Bean 'errorAttributes': Es gibt bereits [Root Bean: class [null]; scope =; abstrakt = falsch; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primär = falsch; factoryBeanName = org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; factoryMethodName = errorAttributes; initMethodName = null; destroyMethodName = (abgeleitet); definiert in der Klasse Pfad Ressource [org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.class]] gebunden

Wie in der Dokumentation erläutert, wird das Problem behoben, indem die Eigenschaft spring.main.allow-bean-definition-overriding auf true gesetzt wird. Meine Frage ist, wie man das im Starter macht (Ich möchte nicht, dass die Benutzer meines Starters aus irgendeinem Grund ihre application.properties-Datei ändern müssen das ist spezifisch für meinen starter)?

Ich habe versucht, eine @PropertySource-Annotation ("classpath: /com/mycompany/starter/application.properties") für meine @Configuration mit der in dieser Datei definierten Eigenschaft zu erstellen, sie funktioniert jedoch nicht.

Was vermisse ich? Kann ich zulassen, dass meine Konfiguration diese Bean überschreibt?

Hier ist der (vereinfachte) Quellcode der Konfiguration:

@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);
            }
        };
    }
}

und meine Ressourcendatei com/mycompany/starter/application.properties enthält

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

6

Die ErrorAttributes -Bohne von Spring Boot wird durch ErrorMvcAutoConfiguration definiert. Es ist mit @ConditionalOnMissingBean Kommentiert, sodass es zurückgesetzt wird, wenn bereits eine ErrorAttributes Bean definiert wurde. Da die von Ihrer Klasse ErrorsConfig definierte Bean versucht, die Bean ErrorAttributes von Boot zu überschreiben, anstatt sie zurückzusetzen, muss Ihre Klasse ErrorsConfig nach der Klasse ErrorMvcAutoConfiguration Klasse. Dies bedeutet, dass Sie ein Bestellproblem in Ihrem Starter haben.

Die Reihenfolge, in der Autokonfigurationsklassen verarbeitet werden, kann mit @AutoConfigureBefore Und @AutoConfigureAfter Gesteuert werden. Angenommen, ErrorsConfig ist selbst eine in spring.factories Registrierte Autokonfigurationsklasse, können Sie Ihr Problem beheben, indem Sie sie mit @AutoConfigureBefore(ErrorMvcAutoConfiguration.class) kommentieren. Mit dieser Änderung an Ort und Stelle definiert ErrorsConfig seine Bean ErrorAttributes, bevor ErrorMvcAutoConfiguration dies versucht. Dadurch wird die automatische Konfiguration der Bean ErrorsAttribute von Boot zurückgesetzt aus.

9
Andy Wilkinson

sie können diesen Befehl einfügen"spring.main.allow-bean-definition-overriding=true" im workspace/project/src/main/resources/applicationproperties Bearbeiten Sie die Datei und fügen Sie den Befehl ein und führen Sie Ihr Projekt im Debug-Modus aus.

1
Sai Kumar Reddy