我按照文档中的说明操作,此处:
http://grails.org/doc/2.3.8/guide/webServices.html#hypermedia
为什么 grails 不能生成 HAL 格式的输出,如文档中所示?
我有一个用@Resource 注释映射的领域对象:
@Resource(uri='/documentCatalogs', formats = ['json', 'xml'], readOnly = true)
class DocumentCatalog {
String entityType
String actionCode
...
}
...在我的 conf/spring/resources.groovy 中,我配置了 HAL JSON 渲染器 bean:
import com.cscinfo.platform.api.formslibrary.DocumentCatalog
import grails.rest.render.hal.HalJsonCollectionRenderer
import grails.rest.render.hal.HalJsonRenderer
// Place your Spring DSL code here
beans = {
halDocumentCatalogRenderer(HalJsonRenderer, DocumentCatalog)
halDocumentCatalogCollectionRenderer(HalJsonCollectionRenderer, DocumentCatalog)
}
使用调试器,我确认调用了 HalJsonRenderer 上的 initialize() 方法,并且它是使用正确的 targetType 构造的。
我使用 Postman 发送休息电话:
http://localhost:8080/formslibrary/documentCatalogs/3
Accept application/hal+json
然后我得到一个常规 JSON 响应,不包含任何链接:
{
"class": "com.cscinfo.platform.api.formslibrary.DocumentCatalog",
"id": 3,
"actionCode": "WITH",
"entityType": "LLP",
...
}
我错过了什么?是否必须为此行为启用某些插件或配置设置?是否有一些未记录的其他映射属性?
最佳答案
想通了!修复有多个方面...
我必须在@Resource 注释中添加“hal”作为列出的格式之一:
@Resource(uri='/documentCatalogs', formats = ['json', 'xml', 'hal'])
调试器中的一些搜索显示,Grails 将根据从客户端发送的 UserAgent 字符串,愉快地忽略 Accept
header 。 (在我的例子中,因为我使用的是 Postman,所以它是 Google Chrome UA 字符串。)
Accept
header 问题的一种解决方法是将“.hal”添加到 URL 的末尾:
http://localhost:8080/formslibrary/documentCatalogs/3.hal
在我看来,这不是一个很好的解决方案,因为渲染器生成的 HAL URL 默认情况下不会以“.hal”结尾。
更好的解决方案是通过更新配置来修复 Grails 对接受 header 的处理。在 Config.groovy 中,您会看到一行内容:
grails.mime.disable.accept.header.userAgents = ['Gecko', 'WebKit', 'Presto', 'Trident']
将其更改为:
grails.mime.disable.accept.header.userAgents = ['None']
这会强制 Grails 接受 Accept
header ,而不管用户代理是什么。
希望这对遇到同样问题的其他人有所帮助。
附言在 ResponseMimeTypesApi#getMimeTypesFormatAware(...)
方法中放置断点非常有用。
关于rest - 为什么我不能获得 HAL 支持以在 grails 2.3.8 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071604/