2015-06-01 5 views
6

Ich benutze Feder mvc, hateoas. Ich habe eine Controller-Aktion, die wie folgt aussiehtSo erstellen Sie eine Verknüpfung, die auf Spring-Controller-Aktion zeigt, die void zurückgibt

@RequestMapping(value = "/images/{userId}/{publicUrl}/{fileName:.+}", method = RequestMethod.GET) 
public void image(@PathVariable Integer userId, @PathVariable String publicUrl, @PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception { 
    try(HellodoxAws aws = haws;){ 
     ..... 
     ..... 
     response.setContentType(image.getObjectMetadata().getContentType()); 
     response.setHeader("ETag",image.getObjectMetadata().getETag()); 
     response.setHeader("Cache-Control",image.getObjectMetadata().getCacheControl()); 
     response.setHeader("Last-Modified",image.getObjectMetadata().getLastModified().toString()); 
     IOUtils.copy(image.getObjectContent(), response.getOutputStream()); 
    }catch (Exception e) { 
     if(e instanceof AmazonS3Exception){ 
      int statusCode = ((AmazonS3Exception) e).getStatusCode(); 
      //System.out.println("Status Code : "+statusCode); 
      response.setContentType("image/jpeg"); 
      if(statusCode==HttpStatus.NOT_MODIFIED.value()){ 
       response.setHeader("ETag",((AmazonS3Exception) e).getAdditionalDetails().get("ETag")); 
       response.setHeader("Cache-Control",((AmazonS3Exception) e).getAdditionalDetails().get("Cache-Control")); 
       response.setHeader("Last-Modified",((AmazonS3Exception) e).getAdditionalDetails().get("Last-Modified")); 
      } 
      response.setStatus(statusCode); 
     } 
    } 
} 

Diese Aktion funktioniert einwandfrei.

Jetzt was ich will, ist URL zu veröffentlichen, um auf jedes Profilbild zuzugreifen. JSON-Format ist soetwas wie dieses

{ 
    "profileId" : 342308, 
    "userId" : 342308, 
    "firstname" : "Henry", 
    "lastname" : "Seol", 
    "title" : "Mr.", 
    "largeImageUrl" : "https://<host>/image/<id>/<publicUrl>/<filename1.jpg>", 
    "thumbImageUrl" : "https://<host>/image/<id>/<publicUrl>/<filename2.jpg>" 
} 

ich diesen Link anstelle des Wertes für „largeImageUrl“ und „thumbImageUrl“ hinzufügen möchten.

Wenn ich linkTo Funktion von hateoas verwenden, sagt es Controller entsprechende Methode sollte nicht void zurückgeben.

Wie erstellt man diese Art von dynamischem Link und fügt sie der Ressource hinzu?

+1

Sie können 'linkTo (...). Slash (...) ...' immer als letzten Ausweg verwenden. Ich frage mich, warum der Rückgabetyp der Methode "ungültig" ist, wenn Sie tatsächlich ein Bild zurückgeben. Die Verwendung von 'HttpServletRequest' oder' HttpServletResponse' als Parameter ist ein No-Go. – zeroflagL

+0

Können Sie mir vorschlagen, wie Sie das Bild in diesem Controller zurückgeben, indem Sie nicht HttpServletRequest oder HttpServletResponse als Parameter oder eine andere Lösung für diesen Controller verwenden? –

+1

Eine Alternative besteht darin, 'ResponseEntity ' zurückzugeben. Die 'InputStreamResource' kann mit 'new InputStreamResource (image.getObjectContent())' erstellt werden, nehme ich an. – zeroflagL

Antwort

3

können Sie die Verwendung

public static ControllerLinkBuilder linkTo(Class<?> controller, Method method, Object... parameters) { 

So sollte es so etwas wie

Link link = linkTo(
    ImageController.class, 
    ImageController.class 
    .getMethod("image", Integer.class, String.class, String.class, HttpServletRequest.class, HttpServletResponse.class), 
    1, 
    "url", 
    "file" 
).withRel("image"); 

Hinweis sein: Es ist eine kürzere Methode

public static ControllerLinkBuilder linkTo(Method method, Object... parameters) { 

aber es hat einen Bug deshalb funktioniert es nicht