2015-08-24 6 views
5

voglio scrivere qualcosa del genere:Come usare la primavera redirect se il metodo di controllo ritorna 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"; 
    } 

comportamento previsto - reindirizzare al controller:

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

ma non posso scriverlo perché "redirect:/member/uploadImage" è String ma dovrebbe essere ResponseEntity

Come posso risolvere il mio problema?

+0

dichiarando 'public String handleFileUpload (@RequestParam String url, @ RequestParam String fileName, RedirectAttributes redirectAttributes)' non consente il reindirizzamento? –

+0

@Jordi Castilla Devo restituire il codice http – gstackoverflow

+0

controllare la mia risposta e collegarmi ... pensate che farà il lavoro per voi –

risposta

2

primavera sono solo zucchero, quando si desidera che l'uscita dal controller a essere post processato da macchinari primavera. Se ho ben capito cosa si sta facendo, si hanno solo 2 possibilità:

  • inviare una risposta di errore con codice 500 e il messaggio "Cannot save file " + fileName
  • redirect al /member/uploadImage nello stesso contesto applicativo.

come la primavera fornisce ulteriori chicche per redirect che per SendError, il mio consiglio sarebbe quello di avere voi il metodo restituisce una stringa:

@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

sì, funziona. Ma il mio codice è brutto. – gstackoverflow

+0

puoi consigliare qualcosa qui http://codereview.stackexchange.com/questions/101800/multiple-try-catch-inside-single-method – gstackoverflow

8

Se non esplicitamente necessario restituire un ResponseEntity si può ridichiarare vostro metodo come:

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

Ma se avete bisogno di usare ResponseEntity, allora sembra è possibile aggiungere un reindirizzamento al ResponseEntity come descritto here . valori metodo di controllo di ritorno

HttpHeaders headers = new HttpHeaders(); 
headers.add("Location", "/member/uploadImage");  
return new ResponseEntity<String>(headers,HttpStatus.FOUND); 
+0

Quale significato di ** HttpStatus.FOUND ** nel vostro secondo caso? – gstackoverflow

+0

è un altro valore della classe ['HttpStatus'] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.html#FOUND) codice 302 (trovato) , come quando si restituisce 'HttpStatus.INTERNAL_SERVER_ERROR' è un codice 500 (Internal ServerError) –

+2

Ho controllato il tuo secondo caso. non funziona per me – gstackoverflow

0

questo potrebbe essere fatto utilizzando la @ExceptionHandler annotazione.

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

Al fine per la primavera per gestire l'errore nel metodo @ExceptionHandler, è richiesto di avere il risolutore org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver deroga ha permesso. Tuttavia, se non hai specificato alcun resolver di eccezioni personalizzato, verrà abilitato per impostazione predefinita.