接上一章,使用命令mvn jetty:run启动Argo,进入localhost的页面:

58在这里给了几种常见的访问和传值方法的示例,当点击到第三条《区分queryString和form参数》时,

会进入Post提交页面,填上name和phone之后提交。

这时遇到以下的错误:

com.bj58.argo.ArgoException: invoke exception.
at com.bj58.argo.ArgoException$ArgoExceptionBuilder.build(ArgoException.java:98)
at com.bj58.argo.internal.ActionInfo.invoke(ActionInfo.java:222)
at com.bj58.argo.internal.MethodAction.matchAndInvoke(MethodAction.java:61)
at com.bj58.argo.internal.DefaultRouter.route(DefaultRouter.java:45)
at com.bj58.argo.internal.DefaultArgoDispatcher.route(DefaultArgoDispatcher.java:89)
at com.bj58.argo.internal.DefaultArgoDispatcher.service(DefaultArgoDispatcher.java:70)
at com.bj58.argo.servlet.ArgoFilter.doFilter(ArgoFilter.java:45)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.bj58.argo.internal.ActionInfo.invoke(ActionInfo.java:217)
... 21 more
Caused by: java.lang.NullPointerException
at com.bj58.argo.servlet.ArgoRequest.getParamsString(ArgoRequest.java:213)
at com.bj58.argo.servlet.ArgoRequest.queryString(ArgoRequest.java:178)
at com.bj58.argo.client.ClientContext$DefaultClientContext.queryString(ClientContext.java:187)
at com.bj58.argo.controllers.HomeController.postForm(HomeController.java:34)
... 26 more

  查看报异常的源码片段:

    public Map<String, Collection<String>> queryStrings() {

        if (queryStrings != null)
return queryStrings; MultiMap<String> params = new MultiMap<String>();
String originQueryString = super.getQueryString(); if(queryStrings != null){ UrlEncoded.decodeTo(originQueryString, params, "UTF-8", maxFormKeys); queryStrings = NullToEmptyMap.safeWrapper(params, getSafeParameter());
}
return queryStrings; }

发现这个代码在逻辑上的确有问题:

if (queryStrings != null) return..
那么接下来又是一个
if (queryStrings != null)

中途又没有对queryStrings赋值,那么queryStrings无论是不是null值,下面的逻辑都毫无意义
显然下面的逻辑不对
将下面的条件改为queryStrings==null,提交成功了。

但是,这样就完了吗?没有
我们看一下ArgoRequest的修改记录,发现最后的改动是因为hzieept 同学报告说有BUG:
post提交时,遇到url如http://ip/a/b/,没有?以及参数情况.ArgoRequest.queryStrings()中调用super.getQueryString()时会返回null,所以要在UrlEncoded中加卫语句

58code认为不应该直接修改urlEncode的代码,理由是:

我们将此判断提前至ArgoRequest中,原则上不修改thirdparty内的source,不利于日后排查问题。

于是才有了后来的修改,把空值判断放ArgoRequest里,但是很显然把空值判断写错了,并且没有经过任何测试,正确的修改应该是这样的:

if(originQueryString != null)

而不是

if(queryStrings != null)

至此,问题解决!

同时,我们看到,58code开源已经不投入人员进行维护了,以前的修改也是草草。不过,Argo项目里面大量的注释写的都很清晰,简明扼要。

[58 Argo]让argo跑起来的更多相关文章

  1. 58 web框架Argo代码分析

    贴地址:https://github.com/58code/Argo 核心jar javax.servlet-api 3.0.1 guice 3.0 velocity 1.7 框架使用 servlet ...

  2. 云原生流水线 Argo Workflow 的安装、使用以及个人体验

    注意:这篇文章并不是一篇入门教程,学习 Argo Workflow 请移步官方文档 Argo Documentation Argo Workflow 是一个云原生工作流引擎,专注于编排并行任务.它的特 ...

  3. 如何使用k3OS和Argo进行自动化边缘部署?

    本文转自边缘计算k3s社区 前 言 随着Kubernetes生态系统的发展,新的技术正在被开发出来,以实现更广泛的应用和用例.边缘计算的发展推动了对其中一些技术的需求,以实现将Kubernetes部署 ...

  4. Java实现龟兔赛跑

    闲极无聊,加上翻手机看到龟兔赛跑的词语,想到了可以通过java起两个线程来实现龟兔赛跑的实现. 代码实现其实很简单: 首先是乌龟类: 然后是兔子类: 最后是赛跑类: 接下里让我们看一下输出结果吧: 乌 ...

  5. [58 Argo]58同城开源web框架Argo搭建实践

    无意间听说58开源的消息(Long long ago),我辈欣喜异常. 一方面感谢开源同仁的辛苦劳动,另一方面也为我辈在互联网技术实践圈外的人提供了一条实践的渠道. 我迫不及待的从github上dow ...

  6. Argo 项目加入 CNCF 孵化器 | 云原生生态周报 Vol. 45

    作者 | 陈洁.高相林.陈有坤.敖小剑 业界要闻 Argo 项目加入 CNCF 孵化器 Argo 项目是一组 Kubernetes 原生工具,用于运行和管理 Kubernetes 上的作业和应用程序. ...

  7. 【kubernetes secret 和 aws ecr helper】kubernetes从docker拉取image,kubernetes docker私服认证(argo docker私服认证),no basic auth credentials错误解决

    aws ecr helper: https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-dock ...

  8. 【 argo 和 kubectl 】

    argo submit --watch xxx.yaml [ --kubeconfig xxx.conf  --namespace xxx ] argo list [ --kubeconfig xxx ...

  9. Argo CD使用指南:如何构建一套完整的GitOps?

    随着Kubernetes继续将自己确立为容器编排的行业标准,为你的应用和工具找到使用声明式模型的有效方法是成功的关键.在这篇文章中,我们将在AWS中建立一个K3s Kubernetes集群,然后使用A ...

随机推荐

  1. LintCode-Search 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix, return the occurrence of ...

  2. cadence16.6 中orcad导出网表时ERROR (ORCAP-5004)

    ORCAD网表输出时 ERROR (ORCAP-5004):Error  initializing COM  property   pages 之前遇到过这个问题,解决后忘了记录下来了.依稀记得问题答 ...

  3. BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树

    题目链接: 题目 2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB 问题描述 a180285非常喜欢滑雪.他来到一座雪山, ...

  4. 完整实例(C# Socket)

    问题描述:          现在创建一个C# Socket实例,客户端断开服务器能立刻输出断开连接客户端信息 服务器端断开,客户端能立刻察觉服务器状态 问题解决: 服务器端代码: 客户端代码: 以上 ...

  5. HTML5网页制作教程:HTML5块级链接

    网页制作Webjx文章简介:Web 标准中处处充满了打脸行为,这条规则现在已经失效了!在那篇文章发布一个月后,HTML5doctor 发表了 “Block-level” links in HTML5, ...

  6. 【HDOJ】【3709】Balanced Bumber

    数位DP 题解:http://www.cnblogs.com/algorithms/archive/2012/09/02/2667637.html dfs的地方没太看懂……(也就那里是重点吧喂!)挖个 ...

  7. Oracle 10G 安装后 不能卸载, 不能打开Web管理....

    1. 不能卸载. 点击这个卸载.   提示:   解决方法: 右键卸载, 设置兼容性为XP. 就可以使用了.    2. oracle10g登录em后,提示"java.lang.Except ...

  8. EXCEL,熟悉又不熟悉的项目管理工具

    EXCEL,熟悉又不熟悉的项目管理工具 如何利用excel做轻量级的项目管理 教你用Excel进行项目管理

  9. Unity3d 一些 常见路径

    Application.persistentDataPath C:\Users\Administrator\AppData\LocalLow\Company Name\Product Name 如果改 ...

  10. ASP .NET 如何在 SQL 查询层面实现分页

    [编者按]本文作者为来自巴基斯坦的软件开发工程师 Aqeeel,主要介绍了在 SQL 查询层面实现 ASP.NET 应用的分页方法. 本文系 OneAPM 工程师编译呈现,以下为正文. GridVie ...