问题
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?
回答1:
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
来源:https://stackoverflow.com/questions/30574431/how-to-create-link-pointing-to-spring-controller-action-that-returns-void