【问题标题】:How to bind parameters in Micronaut controller in Kotlin?如何在 Kotlin 的 Micronaut 控制器中绑定参数?
【发布时间】:2019-05-23 02:57:15
【问题描述】:

参见 gist 中的代码: https://gist.github.com/C06A/e80b783a1d34cc9d80e339da0d7b5b53

这是我尝试在 Kotlin 中使用 Micronaut 制作的一个小型示例项目。

不幸的是,我能够像在代码中那样做的唯一参数绑定。他们需要模板中的模式并输入为字符串。但是我希望能够在 cmets 中做类似的事情。所以模板中不会有模式,并且类型为 Number 和 List(或者 Array 也可以)。

是否可以这样做,为什么它对我不起作用?

【问题讨论】:

  • 你链接的要点是一堆javascript废话
  • 我注意到并修复了。

标签: kotlin binding controller micronaut uritemplate


【解决方案1】:

第一个参数可以简单地键入为数字。但是,第二个参数必须作为字符串引入,因为 Micronaut 无法知道 URI 的部分应如何转换为列表。

/repeat/5/1,2,3,4 ? /repeat/6/1|2|3 ? /repeat/7/[1,2,3]

【讨论】:

  • 谢谢。这说得通。但是我认为它会颠倒模板的逻辑。 URI 模板会将集合转换为 URL 路径,因此如果通过查找集合类型的参数来尝试将多个元素解析到其中,这将是有意义的。
  • 例如,如果模板看起来像“{/name*}”,则集合将被转换为“/value1/value2/value3”。为什么不转换回来?
  • @C.A.B.因为我们无法做出假设
  • 您更改(扩展)了 UriTemplate 语法以包含模式匹配。我相信 RFC 只要求占位符中冒号后的数字字段长度。
  • 我的建议不是假设,而是恕我直言的逻辑用法。匹配可能稍微复杂一些,但逻辑是在编译期间实现的。例如路径 "/repeat/5/1,2,3,4" 将匹配模式 "/repeat/{value}{/stack}" 而 "/repeat/5/1/2/3/4" 将匹配 - - “/repeat/{value}{/stack*}”。我不知道“|”分隔的列表(看不到它会中继到什么),但你的最后一个例子应该匹配我没有“*”的模式。
【解决方案2】:

我在某处发现模式“/{+stack}”会匹配包含斜杠的字符串。这不是我想要的,但同时也很有帮助。这也不允许将此参数设为可选。那好吧! :-(

【讨论】:

  • {/+stack} 将使其成为可选
  • 我尝试了这个,即使它与 URI 模板 RFC 非常匹配。但是它不起作用。我收到错误消息:“路由声明了一个名为 [+stack] 的 uri 变量,但不存在相应的方法参数”。根据 URI 模板概念,这是有道理的。
  • 应该是{/stack+}
  • 这根本不像 URI 模板。 Micronaut URI Templar 和相应的 RFC 之间是否存在文档列表差异?
  • 一年前有,但你没有提供这个文档之王。我认为它会非常有用。
猜你喜欢
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多