接上一章,使用命令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. cocos2dx中创建动画的三种方法

    1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...

  2. 1452: [JSOI2009]Count - BZOJ

    Description Input Output Sample Input Sample Output 1 2HINT 一开始还想什么离线做,其实不用,空间足够,我们直接开100个二维树状数组,然后就 ...

  3. Nginx 301重定向域名

    为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名.网页的扩展名改变.网站域名改变等.如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个4 ...

  4. 【Vijos】【1164】曹冲养猪

    中国剩余定理 没啥重要的……模板题,中国剩余定理就是解出模线性方程组的一个可行解(好像也是唯一解?) 这是一种神奇的构造方法……明白了为什么这样构造是对的就行了=.=至于怎么想到这种构造方法的……去问 ...

  5. SQLServer 触发器 同时插入多条记录有关问题

    由于 SQL Server 的触发器, 没有 FOR EACH ROW (ORACL中有)的选项, 有时候不正确的使用 inserted 与deleted 可能会有点麻烦. 下面来一个简单的例子 -- ...

  6. HDU1002 -A + B Problem II(大数a+b)

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. JAVA Hibernate工作原理及为什么要用(转)

    hibernate 简介:hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库.hibernate核心接口 ...

  8. 【Asp.Net MVC-视频】

    Asp.Net MVC官网网发布的pluralsight视频教学: http://pluralsight.com/training/Player?author=scott-allen&name ...

  9. UVALive 3977

    直接搜索,简单题: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm ...

  10. mysqlbinlog工具基于日志恢复详细解释

    如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作 1)RESET MASTER在上面查看日志存放的文件夹中 ...