【问题标题】:How to create link pointing to Spring controller action that returns void如何创建指向返回 void 的 Spring 控制器操作的链接
【发布时间】:2015-08-14 23:13:26
【问题描述】:

我正在使用 spring mvc,hateoas。我有一个看起来像

的控制器动作
@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);
        }
    }
}

这个动作效果很好。

现在我想要发布 url 以访问每个配置文件的图像。 JSON格式是这样的

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

我想添加该链接来代替“largeImageUrl”和“thumbImageUrl”的值。

如果我使用 hateoas 的 linkTo 函数,它说控制器的相应方法不应该返回 void。

如何创建这种动态链接并将其添加到资源中?

【问题讨论】:

  • 您始终可以使用linkTo(...).slash(...)... 作为最后的手段。我想知道为什么当您实际返回图像时该方法的返回类型是void。将HttpServletRequestHttpServletResponse 作为参数是不行的。
  • 您能否建议我如何通过不使用 HttpServletRequest 或 HttpServletResponse 作为参数或此控制器的任何其他解决方案来在此控制器中返回图像?
  • 另一种选择是返回ResponseEntity&lt;InputStreamResource&gt;。我假设InputStreamResource 可以用new InputStreamResource(image.getObjectContent()) 创建。
  • 虽然在这个特定的例子中可能会改变,但还有其他一些地方可以使用 void 并且是设计的,例如action 应用副作用并且不返回任何内容。

标签: spring spring-mvc spring-data-rest spring-hateoas


【解决方案1】:

你可以使用

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

所以应该是这样的

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

注意: 有一个更短的方法

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

但它有一个错误,因此它不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多