Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create link pointing to Spring controller action that returns void

I am using spring mvc, hateoas. I have a controller action that looks like

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

This action works perfectly well.

Now what I want is to publish url to access each profiles' image. JSON format is some thing like this

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

I want to add that link in place of the value for "largeImageUrl" and "thumbImageUrl".

If I use linkTo function of hateoas it says controller's corresponding method should not return void.

How to create these kind of dynamic link and add it to the resource?

like image 247
John Maclein Avatar asked Jun 01 '15 13:06

John Maclein


1 Answers

You can use the

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

So it should be something like

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

Note : There is a shorter method

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

but it has a bug therefore it does not work

like image 51
Peter Szanto Avatar answered Oct 18 '22 12:10

Peter Szanto