2017-06-23 10 views
0

Meine Frage ist sehr einfach, aber ich verstehe nicht wirklich, wie es funktioniert. In sprin Boot verwenden wir MultipartFile Dateien von Client unterSpring Boot, MultipartFile Methoden

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
    @ResponseBody 
    public String uploadFile(@RequestParam("file") MultipartFile uploadfile) { 
     System.out.println("NAme: "+uploadfile.getName()); 
     System.out.println(""); 
     return "DOne"; 
    } 

zum Server ab zu bekommen, aber ich weiß, dass MultipartFile Schnittstelle ist, so dass alle Methoden wie getName ist abstrack, wie ich in der Lage diese Methoden zu verwenden, ohne sie zu ovveriding ?

+0

Es gibt eine Instanz von etwas, das als "MultipartFile" betrachtet werden kann. Wenn es keine Instanz gäbe, wäre es für diesen Code buchstäblich unmöglich zu funktionieren. – Makoto

+0

Kannst du Code Beispiel geben, ich verstehe nicht, in meiner Sicht verwenden wir Schnittstelle nur um Methoden zu beschreiben, die von anderen Klassen implementiert werden können –

+0

Und Sie erhalten eine Implementierung dieser Schnittstelle injiziert. Abhängig davon, welchen Datei-Upload-Mechanismus Sie verwenden. Spring verwendet eine Vielzahl von Schnittstellen, um Sie von der eigentlichen Implementierung wegzulösen. –

Antwort

2

Wenn Sie bei Spring Quellen suchen, werden Sie CommonsMultipartFile finden, die Methoden wie getName() implementiert

Wenn Sie erklären, dass Sie eine MultipartFile erhalten möchten, können Sie kümmern sich nicht wirklich, wie es hinter den Kulissen implementiert ist . Sie interessieren sich nur für die Datei. Spring Framework wird entscheiden, welche Implementierung Sie bereitstellen soll.

Andere interessante Implementierung ist MockMultipartFile, die während der Tests verwendet werden können. Da es dieselbe Schnittstelle implementiert, müssen Sie Ihre Methoden in keiner Weise ändern.

Da es eine Schnittstelle ist, musste jemand die Implementierung bereitstellen. In diesem Fall stellt Spring es zur Laufzeit bereit.

+0

Danke für die Antwort, aber wie funktioniert es, ich meine Frühling vergessen und nur auf Methode String uploadFile (@RequestParam ("Datei") MultipartFile Uploaddatei) Ich bekomme Instanz der Schnittstelle, die noch überschrieben wurde, aber ich weiß es nicht Wie und welche Klasse überschreibt Schnittstelle, wie funktioniert es? –

+0

Sie müssen nicht die genaue Klasse kennen, die die Schnittstelle implementiert, um diese Schnittstelle zu verwenden. https://stackoverflow.com/questions/21281203/how-does-an-interface-in-java-work –

+0

@ АлмасАбдразак: Ich habe das Gefühl, dass Sie auf [was eine Schnittstelle ist] (https: // docs .oracle.com/javase/tutorial/java/IandI/createinterface.html), bevor Sie mit Spring weitermachen. Große Mengen von Spring basieren auf den mit Schnittstellen gelieferten Prinzipien. – Makoto

0

Der Frühling hat einige Klassen, die MultipartFile Schnittstelle implementieren. Zum Beispiel ist es CommonsMultipartFile Klasse: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsMultipartFile.html

Wenn eine mehrteiliger Form auf dem Controller gesendet wird, parst Frühling die Form, baut einiges Objekt der Klasse Umsetzung MultipartFile (wahrscheinlich, dass CommonsMultipartFile) und ruft Ihre Controller-Methode mit diesem Objekt als Parameter.

Sie müssen also nicht MultipartFile Methoden implementieren, sie sind bereits von Spring implementiert.

1

Wie Spring MVC Dateiuploads behandelt, wird in der relevant section des Spring Reference Guide erläutert.

Wenn eine Anfrage eingeht, erreicht sie zuerst die DispatcherServlet, sie erkennt, dass es sich um eine mehrteilige Anfrage handelt und delegiert die Anfrageverarbeitung an eine konfigurierte MultipartResolver (die wiederum eine Schnittstelle ist). Die DispatcherServlet erkennt diese MultipartResolver durch einen bekannten Namen multipartResolver (dies ist in der DispatcherServlet Hardcoded).

Was diese MultipartResolver Instanzen tun, ist die tatsächliche HttpServletRequest in eine MultipartServletRequest wickeln (was ein Spring MVC-Erweiterung auf die HttpServletRequest) and this wrapper knowns how to handle the incoming request and create the appropriate MultipartFile` Implementierungen ist.

Frühling hat 3 Aromen dieser Schnittstelle

  1. CommonsMultipartResolver mit Apache Commons FileUpload
  2. StandardServletMultipartResolver Verwendung der Servlet 3.0 Standard-Servlet-API-Datei hochladen
  3. MockMultipartFile für Unit-Tests

Bei der Verwendung von Frühling Boot to handle file uploads es configures die zweite Option standardmäßig die StandardServletMultipartResolver.

Wenn die komplexe Verarbeitung der mehrteiligen Anforderung abgeschlossen ist, gibt DispatcherServlet die Anforderung an den ausgewählten Handler (d. H. An Ihren Controller) weiter. Die RequestMappingHandlerAdapter prüft die ausgewählte Anforderungsbehandlungsmethode und füllt alle Methodenargumente aus.

Am Ende ist es die RequestParamMethodArgumentResolver, die einen tatsächlichen Wert an das Objekt MultipartFile bindet. Unter Verwendung der getFiles Methode auf der MultipartServletRequest. Für die Standard-Frühlings-Boot konfiguriert Implementierung (die StandardMultipartHttpServletRequest), wird dies Instanzen StandardMultipartFile geben, das ist eine eingebettete Klasse in dem StandardMultipartHttpServletRequest

Der Vorteil, dass die MultipartFile Schnittstelle zu verwenden, ist, dass Sie CommonsMultipartResolver ohne Änderungen ändern könnten Dein Controller.