2015-08-24 5 views
5

ich so etwas schreiben will:Wie Frühjahr Umleitung verwenden, wenn Controller-Methode gibt ResponseEntity

@RequestMapping(value = { "/member/uploadExternalImage", 
      "/member/uploadExternalImage" }, method = RequestMethod.GET) 
    public ResponseEntity<String> handleFileUpload(@RequestParam String url,@RequestParam String fileName, RedirectAttributes redirectAttributes) { 
     ... 
     return new ResponseEntity("Cannot save file " + fileName, HttpStatus.INTERNAL_SERVER_ERROR); 
     ... 
     return "redirect:/member/uploadImage"; 
    } 

erwartete Verhalten - an den Controller umleiten:

@RequestMapping(value = { "/member/createCompany/uploadImage", 
      "/member/uploadImage" }) 
    @ResponseBody 
    public ResponseEntity<String> handleFileUpload(@Validated MultipartFileWrapper file, 
      BindingResult result, Principal principal 

Aber ich es "redirect:/member/uploadImage" weil nicht schreiben kann ist String aber sollte ResponseEntity sein

Wie kann ich mein Problem lösen?

+0

deklarieren 'public Zeichenfolge handleFileUpload (@RequestParam String-URL, @ RequestParam String fileName, RedirectAttributes redirectAttributes)' können Sie nicht umleiten? –

+0

@Jordi Castilla Ich brauche Rückkehr HTTP-Code – gstackoverflow

+0

überprüfen Sie meine Antwort und verlinkt ... denke, es wird die Arbeit für Sie tun –

Antwort

2

Die Rückgabewerte der Spring Controller-Methode sind nur Zucker, wenn Sie möchten, dass die Ausgabe vom Controller von Spring Maschinerie nachbearbeitet wird. Wenn ich es richtig verstanden haben, was Sie tun, haben Sie nur zwei Möglichkeiten:

  • eine Fehlermeldung mit dem Code senden 500 und Nachricht "Cannot save file " + fileName
  • -/member/uploadImage in der gleichen Anwendungskontext umleiten.

Als Frühling mehr Goodies für Redirect liefert als für SendError, mein Rat wäre Ihnen Methode einen String zurückgeben haben:

@RequestMapping(value = { "/member/uploadExternalImage", 
      "/member/uploadExternalImage" }, method = RequestMethod.GET) 
    public String handleFileUpload(@RequestParam String url, @RequestParam String fileName, 
      RedirectAttributes redirectAttributes, HttpServletResponse resp) { 
     ... 
     //return new ResponseEntity("Cannot save file " + fileName, HttpStatus.INTERNAL_SERVER_ERROR); 
     resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
      "Cannot save file " + fileName); // explicitely put error message in request 
     return null; // return null to inform Spring that response has already be processed 
     ... 
     return "redirect:/member/uploadImage"; 
    } 
+0

ja es funktioniert. Aber mein Code ist hässlich. – gstackoverflow

+0

können Sie hier etwas beraten http://codereview.stackexchange.com/questions/101800/multiple-try-catch-inside-single-method – gstackoverflow

8

Wenn Sie nicht explizit benötigen ein ResponseEntity Sie Ihre Methode zurückgeben wie neu deklarieren können:

public String handleFileUpload(@RequestParam String url,@RequestParam String fileName, RedirectAttributes redirectAttributes) { 
    return "Cannot save file " + fileName; 
    ... 
    return "redirect:/member/uploadImage"; 
} 

Aber wenn Sie ResponseEntity verwenden müssen, dann scheint es, Ihnen eine Umleitung zu ResponseEntity wie beschrieben hinzufügen here .

+0

Welche Bedeutung von ** HttpStatus.FOUND ** in Ihrem zweiten Fall? – gstackoverflow

+0

ist ein anderer Wert der Klasse ['HttpStatus'] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.html#FOUND) Code 302 (gefunden) , wie wenn Sie 'HttpStatus.INTERNAL_SERVER_ERROR' zurückgeben, ist ein Code 500 (Interner ServerError) –

+2

Ich überprüfte Ihren zweiten Fall. es funktioniert nicht für mich – gstackoverflow

0

dies geschehen könnte die @ExceptionHandler Anmerkung verwenden.

@RequestMapping(value = { "/member/uploadExternalImage", "/member/uploadExternalImage" }, method = RequestMethod.GET) 
public String handleFileUpload(@RequestParam String url, @RequestParam String fileName, 
     RedirectAttributes redirectAttributes) throws FileUploadException { 
    ... 
    throw new FileUploadException("Cannot save file " + fileName); 
    ... 
    return "redirect:/member/uploadImage"; 
} 

@ExceptionHandler(FileUploadException.class) 
ResponseEntity<String> handleFileUploadError(final FileUploadException e) { 
    return new ResponseEntity(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); 
} 

Um für den Frühling, den Fehler in Ihrer @ExceptionHandler Methode zu behandeln, ist es erforderlich, dass Sie den org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver Ausnahme Resolver aktiviert haben. Wenn Sie jedoch keine benutzerdefinierten Ausnahme-Resolver angegeben haben, wird diese standardmäßig aktiviert.

Verwandte Themen