2017-09-06 2 views
2

Während ich eine vorhandene Spring-Anwendung betrachtete, stolperte ich über eine Klasse mit Feldinjektion, von der wir alle wissen, dass sie aus verschiedenen Gründen nicht empfohlen wird. Ich habe mich dann entschieden, es zu refaktorisieren, um einen angemesseneren Ansatz zu verwenden: konstruktorbasiertes DI.Feldinjektion funktioniert, aber Konstruktorinjektion gibt NullPointerException zurück

Vor

@Component 
public class MaintenanceModeInterceptor implements HandlerInterceptor { 

    private static final String MAINTENANCE_MODE_VIEW = "common/maintenanceMode"; 

    private ApplicationObject applicationObject; 

    public MaintenanceModeInterceptor() { 
     // Required by Spring 
    } 

    @Autowired 
    public MaintenanceModeInterceptor(ApplicationObject applicationObject) { 
     this.applicationObject = applicationObject; 
    } 
... 
} 

Vielleicht ist es mit der Tatsache verbunden Nach Refactoring

@Component 
public class MaintenanceModeInterceptor implements HandlerInterceptor { 

    private static final String MAINTENANCE_MODE_VIEW = "common/maintenanceMode"; 

    @Autowired 
    private ApplicationObject applicationObject; 

    public MaintenanceModeInterceptor() { 
     // Required by Spring 
    } 
... 
} 

Refactoring, dass ein Standard-Konstruktor vorhanden ist. wenn ich es jedoch entfernen, ich am Ende mit dieser Ausnahme:

Caused by: java.lang.NoSuchMethodError: my.application.web.interceptor.MaintenanceModeInterceptor: method <init>()V not found 

Also mein Verständnis ist, dass Frühling einen Standardkonstruktor für Abfangjäger erfordert.

Gibt es eine Möglichkeit, Konstruktor basierte DI in diesem Szenario zu erreichen?

Vielen Dank.

+1

Ich denke, Sie sollten den nicht @ Autowired Konstruktor entfernen und führen Sie eine saubere Build für Ihr Projekt. – pleft

+1

gearbeitet. Und in MvcConfig.java habe ich ApplicationObject applicationObject als Feld autowired und dann verwendet, um den MaintenanceModeInterceptor @Bean zu definieren. Ich schlage vor, dass Sie eine Antwort posten, damit ich sie akzeptieren kann. :) –

Antwort

1

Ich denke, Sie sollten den nicht @Autowired Konstruktor entfernen und führen Sie eine saubere Build auf Ihr Projekt.

Verwandte Themen