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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With