Spring 数据 REST 内容协商

Spring data REST content negotiation

我有一个带注释的 RepositoryRestResource 域 objects,其字段也包含二进制数据(图像)。Spring Rest machinery 将为这些创建很好的 RESTful 链接字段,但我还想介绍一个处理程序,当浏览器发送 "image/*" 接受 header.

时,returns 是裸二进制文件

我可以在相同的路径上覆盖一个控制器,但它很脆弱,我宁愿为此编写一个策略 class。

可能吗?知道将它插入 Spring 管道的什么位置吗?

TIA, 爱德华多

使用@RepositoryRestController 注释"properly",您应该能够将控制器覆盖限制为仅"image/*"。

假设您有一个简单的域对象模型(getters/setters 并省略了一些注释...)

public class Item {
    @Id
    private String id;
    private String name;
}

让我们只为 image/* 覆盖控制器

@RepositoryRestController
@ResponseBody
public class ItemRepositoryRestController {

    @Autowired
    private ItemRepository repository;

    @RequestMapping(value = "/items/{id}", method = RequestMethod.GET,
                    produces = "image/*")
    public Item getItem(@PathVariable(value = "id") String id)
    {
        Item item = repository.findOne(id);
        /* do some magic with your item */

        return item;
    }

显然,这里没有 image/* 数据 returned - 你实际上会得到一个 400 错误 - 但你只有在询问时才能到达这个控制器如果接受 image/*,同时通过自动 Spring Rest Controller 当不要求 image/* 当且仅当你使用@RequestMapping at the method level.

我还没有达到 return 原始二进制数据的地步,您可能必须直接使用 HttpServletResponse,如图 所示。或者您可能已经有了答案,因为在您的评论中您提到已经添加了另一个资源路径(在这种情况下,我对您如何 return 原始数据感兴趣)。