gpt4 book ai didi

java - 在 Action 组合期间访问 Play Framework 路由参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:26 24 4
gpt4 key购买 nike

我有一个操作要应用于我的 Play 应用程序中的多个路由。这些路由对产品执行操作,并且产品可以有多个版本。我希望我的 API 能够工作,以便用户可以明确指定一个版本(通过查询参数),如果他们没有指定一个版本,我们将从数据库中为他们查找最新版本并对其进行操作。所以这个 Action 需要能够查找产品的最新版本,但我们需要知道正在请求的是哪个产品。在路由的 Controller 中,这是显而易见的。 Play 以路由参数作为参数调用路由 Controller :

@RequireProductVersion()
public CompletionStage<Result> getProduct(String productId) {
...
}

但在我们的操作中,我们只有这个 Play 内部 Context 对象可以使用。我的操作看起来像这样:

public class RequireProductVersion extends Action<RequireProductVersion> {
@Override
public CompletionStage<Result> call(Http.Context ctx) {
final String version = ctx.request().getQueryString("version");
// if an explicit "version" parameter was specified, verify it and use it
if (version != null) {
...
} else {
// look up the latest version for this product
final String productId = ctx.request.????getParameter("productId");
return lookupLatestProductVersion(productId).thenCompose( ... );
}
}
}

虽然我在那个 Action 中有一些额外的有效性检查。有时我会立即从那里返回一个错误。因此,我们可以通过向所有路由添加查询字符串参数“version”并在我的每个路由 Controller 中添加六行代码来替换此 Action 组合解决方案:

@RequireProductVersion()
public CompletionStage<Result> getProduct(String productId, @Nullable String productVersion) {
final int productVersion;
try {
productVersion = Utils.getProductVersion(productId, productVersion);
} catch (ProductVersionException e) {
return CompletableFuture.completedFuture(e.getAppropriateResult());
}
...
}

但我认为这个用例正是 Action 组合的用途。似乎缺少路由参数。实际上,在 Action call() 方法中公开的 Context 对象包含很多内容。 header 在那里,查询参数在那里,甚至被命中的确切路径也在那里!即使不是这样,到那时框架已经解析了路由并确定了路由参数的值。这一定是真的,因为如果不是,那么它怎么知道调用哪个 Action ?然而,这些解析后的参数似乎对我们来说是完全不可用的。我们可以自己从路径中再次解析它们。但是为什么我们必须这样做呢?我们将解析路径两次。为什么框架不公开这些值?

我发现了一篇有趣的文章,为了解决类似的问题,建议将 url 参数放入查询字符串参数映射中。 https://alots.wordpress.com/2014/05/01/accessing-url-parameters-as-get-parameters-in-play/然而,在我看来,这种方法基本上也是对路径进行双重解析,尽管我可能会误解它,因为我对 Scala 不是很熟悉。如果是这样,我还不如破解逻辑来重新解析我的 Action 中的路径。

最佳答案

好吧,这个问题在 Scala 中是可以解决的。由于 Play Java 如何使用注释进行 Action 组合(以及对于正文解析器,这是我遇到完全相同问题的另一个地方),因此目前在 Java 中似乎没有任何方法可以解决它。您将不得不自己再次解析路径。但是,在 Scala 中似乎很容易实现。我没有测试过其中任何一个,我对 Scala 也不是很熟悉,但是对于 Play in Scala 来说, Action 组合的工作方式似乎有所不同。

这个要点有一个 Play Scala Action 组合应该如何支持这个的例子: https://gist.github.com/wolfendale/75e8b5e9a7ace95aa7e6d123e6c6dacd

jroper 在这个问题线程中的帖子也展示了在我看来是相同的解决方案: https://github.com/playframework/playframework/issues/3378#issuecomment-54925034

如果这些有效,则 article I linked in the original post 中展示的技术如果您使用的是 Scala,则完全没有必要解决此问题。然而,因为它只需要在 Scala 中编写一些代码(而对于 wolfendale 和 jroper 演示的技术,您还需要在 Scala 中编写您的 Controller ),它可能是解决这个问题的有用方法,并且仍然可以编写您的大部分内容Java中的应用程序。我不确定。我还没有测试过,我对那种 hack 不感兴趣。

关于java - 在 Action 组合期间访问 Play Framework 路由参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com