Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在动作合成期间访问播放框架路由参数_Java_Playframework - Fatal编程技术网

Java 在动作合成期间访问播放框架路由参数

Java 在动作合成期间访问播放框架路由参数,java,playframework,Java,Playframework,我有一个操作要应用于我的Play应用程序中的多条路线。这些路由对产品执行操作,产品可以有不同的版本。我希望我的API能够工作,这样用户就可以显式地(通过查询参数)指定一个版本,如果他们没有指定一个版本,我们将从DB中查找最新的版本并对其进行操作。因此,此操作需要能够查找产品的最新版本,但我们需要知道需要哪个产品。在路线的控制器中,这是显而易见的。Play使用路由参数作为参数调用路由控制器: @RequireProductVersion() public CompletionStage<Re

我有一个操作要应用于我的Play应用程序中的多条路线。这些路由对产品执行操作,产品可以有不同的版本。我希望我的API能够工作,这样用户就可以显式地(通过查询参数)指定一个版本,如果他们没有指定一个版本,我们将从DB中查找最新的版本并对其进行操作。因此,此操作需要能够查找产品的最新版本,但我们需要知道需要哪个产品。在路线的控制器中,这是显而易见的。Play使用路由参数作为参数调用路由控制器:

@RequireProductVersion()
public CompletionStage<Result> getProduct(String productId) {
    ...
}
虽然我有一些额外的有效性检查的行动。有时我会立即从那里返回一个错误。因此,我们可以通过将查询字符串参数“version”添加到所有路由并在每个路由控制器中添加六行代码来替换此动作合成解决方案:

@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());
    }
    ...
}
@requireReplicationVersion()
public CompletionStage getProduct(String productId,@Nullable String productVersion){
最终版本;
试一试{
productVersion=Utils.getProductVersion(productId,productVersion);
}捕获(ProductVersionException e){
返回CompletableFuture.completedFuture(例如getpropertedresult());
}
...
}
但我认为,这个用例正是动作合成的目的。只是路线参数似乎丢失了。实际上,Action call()方法中公开的
Context
对象包含很多内容。标题在那里,查询参数在那里,甚至被点击的确切路径也在那里!即使不是这样,框架也已经解析了路由并确定了路由参数的值。这一定是真的,因为如果它不是,那么它怎么知道该调用哪个操作呢?然而,我们似乎完全无法使用这些解析的参数。我们可以自己从路径上再次解析它们。但我们为什么要这么做呢?我们将对路径进行两次解析。为什么框架不公开这些值

我发现了一篇有趣的文章,为了解决一个类似的问题,提出了一种将url参数放入查询字符串参数映射的方法。
然而,在我看来,这种方法基本上也是双重解析路径,尽管我可能会误解它,因为我不太熟悉Scala。如果是这样的话,我还不如在我的行动中破解逻辑来重新分析路径。

你不能,至少不能开箱即用。Play不提供在动作合成中获取请求参数的方法


基本上:您必须解析自己。

好的,这个问题在Scala中是可以解决的。由于PlayJava如何使用注释进行动作合成(以及主体解析器,这是我遇到的另一个完全相同的问题),目前似乎没有任何方法在Java中解决这个问题。您必须自己再次解析路径。然而,在Scala中似乎很容易实现。这两个我都没有测试过,我对Scala也不是很熟悉,但对于Scala中的游戏来说,动作合成的工作原理是不同的

本要点举例说明了Play Scala action composition应如何支持这一点:

jroper在本期帖子中的帖子也展示了我认为相同的解决方案:

如果这些都有效,那么在使用Scala时,中演示的技术根本不需要解决此问题。然而,因为它只需要在Scala中编写一些代码(而对于wolfendale和JOper演示的技术,您也需要在Scala中编写控制器),所以它可能是解决此问题的一种有用方法,并且仍然可以用Java编写大部分应用程序。我不确定。我还没有测试过它,我对这种黑客不感兴趣

@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());
    }
    ...
}