2015-06-01 15 views
6

Tôi đang sử dụng mvc mùa xuân, ghét. Tôi có một hành động điều khiển trông giống nhưCách tạo liên kết trỏ đến hành động Bộ điều khiển lò xo trả về void

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

Hành động này hoạt động hoàn hảo.

Bây giờ những gì tôi muốn là xuất bản url để truy cập hình ảnh của từng tiểu sử. Định dạng JSON là một số thứ như thế này

{ 
    "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>" 
} 

Tôi muốn thêm liên kết đó vào vị trí của giá trị cho "largeImageUrl" và "thumbImageUrl".

Nếu tôi sử dụng chức năng linkTo của hateoas, phương thức tương ứng của bộ điều khiển không được trả về void.

Cách tạo loại liên kết động này và thêm liên kết đó vào tài nguyên?

+1

Bạn luôn có thể sử dụng 'linkTo (...). Slash (...) ...' làm phương sách cuối cùng. Tôi tự hỏi tại sao kiểu trả về của phương thức là 'void' khi bạn thực sự trả về một hình ảnh. Có 'HttpServletRequest' hoặc' HttpServletResponse' làm tham số là không có. – zeroflagL

+0

Bạn có thể gợi ý cho tôi cách trả về hình ảnh trong bộ điều khiển này bằng cách không sử dụng HttpServletRequest hoặc HttpServletResponse làm tham số hay bất kỳ giải pháp nào khác cho bộ điều khiển này không? –

+1

Một cách khác là trả về 'ResponseEntity '. 'InputStreamResource' có thể được tạo với' new InputStreamResource (image.getObjectContent()) ', tôi giả sử. – zeroflagL

Trả lời

3

Bạn có thể sử dụng

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

Vì vậy, nó phải được cái gì đó như

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

Lưu ý: Có một phương pháp ngắn

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

nhưng nó có một lỗi do đó nó không hoạt động

Các vấn đề liên quan