- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个操作要应用于我的 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/
我有一个问题,但由于 this question 部分正在解决,但我想知道如何计算给定间隔之间的天数。 这是一个计算员工休假天数的查询。所以给定(或不给定)一个日期范围,我想计算给定间隔之间有多少假期
变量dateSubtract结果是 16,但我想找到这 2 天之间的总天数,应该是 165。没有 JODA TIME 我该如何做到这一点? String date = "06/17/2014"; Da
我想选择创建日期介于给定月份的第一天和最后一天之间的记录。我通过以下方式计算开始日期和结束日期的月份: 日期“月份”只是时间范围内的随机日期 Calendar cal = Calendar.getIn
我有一个对你们大多数人来说可能微不足道的问题。我尝试了很多,没有找到解决方案,所以如果有人能给我提示,我会很高兴。起点是每周 xts -时间序列。 月周值(value)目标 2011 年 12 月 W
我有一个 Facebook 应用程序,它将用户生日作为 varchar 存储在 mysql 数据库中。我正在尝试获取所有用户的生日 1周后推出,如果是在本周如果生日是上周。 在我的 php 中,我获取
我正在使用以下代码来获取年、月、日中的两个日期之间的差异 tenAppDTO.getTAP_PROPOSED_START_DATE()=2009-11-01 tenAppDTO.getTAP_PRO
我想检查当前时间(在 C++ 中)是否在一个时间范围内。 我想从元组 ("12:00", "17:30") 构造时间范围,即 (string, string) 并检查时间 now() 是否介于两者之间
gitlab 有一个功能,如果我在提交消息中放入票号,那么提交将与 gitlab.com 上的票相关联。 这在进行代码审查时非常方便。不幸的是,开发人员有时会忘记这样做。 我想指定 git hooks
我正在尝试制作使用SQLite数据库的简单注册/登录应用程序,到目前为止我得到了这段代码。这是我的“注册” Activity ,我猜它应该在按下注册按钮后将用户名和 pin(密码)实现到数据库,遗憾的
我正在尝试打开、关闭和写入文件。每当我尝试打开一个文件时,如果我提供的路径中不存在该文件,程序就会告诉我。如果存在,程序将读取其中的内容并显示它。如果用户不想查找文件,可以选择创建文件并用数据填充它。
我想要我的至slideToggle每当发生 react 性变化时,但到目前为止我还无法使其发生。我尝试在 rendered 中使用 JQuery和created模板的事件,但它没有触发。 触发此操作的
我们的 MySQL 遇到了神秘的网络问题。简单的更新查询(使用索引更新单行)通常会立即运行,然后有时(假设 1000 次中有 1 次)因超时而失败。与简单的插入查询相同。数据库没有过载。我们怀疑网络问
我正在使用 actionbarsherlock 的 ActionBar,第一次以横向或水平方向运行应用程序时,选项卡以 Tabs Mode 显示。将方向更改为纵向后,导航模式仍在 Tabs 中。第二次
每天晚上(太平洋标准时间晚上 8 点)我都会对生产数据库(innoDB 引擎)进行全局备份。 这是 mysqldump 命令: mysqldump -u$MYSQLUSER -p$MYSQLPWD -
当我的应用程序第一次启动时,它应该显示用户协议(protocol),这是一个 59kb 的 txt 文件。由于读取文件并将其附加到 TextView 需要一些时间,因此我决定在异步任务中执行此操作并在
如何只允许一个“.”在按键期间的javascript中? 我这里有一个代码: function allowOneDot(txt) { if ((txt.value.split(".")
我已经创建了像主页和用户这样的标题图标。在桌面 View 中,如果我单击用户图像,它会显示相应的重定向页面。如果我在选项卡或移动 View 中将其最小化, 它什么都不显示。此问题仅发生在用户图像上,而
下面的代码在 Release模式下工作,并且仅在 Debug模式下在 g_ItemList.push_back() 引发错误,我浏览了一些 SO 帖子和论坛。有人提到 "You can't itera
我遇到了一个我似乎无法解决的 mmap 问题。下面是设置:我使用 malloc 将一个巨大的多维数组分配到内存中,用我的值填充它,然后我想将它保存在一个文件中。该数组包含 3200000000 个字节
尝试加载共享库: handle = dlopen( "libaaa.so.2.5", RTLD_NOW ); if ( !handle ) { printf("Failed t
我是一名优秀的程序员,十分优秀!