解惑

解己之惑,解人之惑

作者:cherami (第29页共82页)

CXF2.1.1有问题

开始搞Web Service,用了CXF,下载了2.0.8和2.1.1,开始弄的是2.1.1,发现有问题:

java.lang.NoSuchMethodError: org.jaxen.BaseXPath.<init>(Ljava/lang/String;Lorg/jaxen/Navigator;)V

怎么也发布不成功,后来修改成2.0.8,发现可以了,通过浏览器访问什么的都没有问题,然后从wsdl生成stubs后,运行unit test有问题:
java.lang.IncompatibleClassChangeError
    at org.apache.cxf.wsdl11.WSDLServiceBuilder.copyExtensionAttributes(WSDLServiceBuilder.java:120)
    at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:228)
    at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:153)
    at org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:117)
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:138)
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:129)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:55)
    at javax.xml.ws.Service.<init>(Service.java:57)
 
唉,步履维艰啊

2008年8月21日更新:
发现这些都是Classpath搞的,因为原来的工程中也包含了老版本的Web  Service的包,我们这个工程在原来的工程里面,但是我发布的时候没有包含原来的jar,但是Eclipse工程里面是依赖的,所以Server运行没有问题,在Eclipse跑单元测试的时候有问题。

2.1.1的问题是DOM4J.JAR搞的,里面也包含了jaxen的类,把那些类从jar包里面去掉问题解决

开始研究Web Service

新的项目其实是转向Web Service的,公司的整体架构将采用SOA,本来这一阶段只是个临时阶段,但是Web Service的任务要提前开始了,因为另外一个新的项目需要使用我们的Service,而现在的这个项目是基于一个老的项目,只使用EJB2,所以在原来的项目的EJB3和Web Service可以根据Annotation自动发布的基础设施都不存在了,而且架构师打算弃用JBoss,转向Tomcat,所以现在最简单的方案就是基于Axis自己写必须的东西了,还不是很清楚,要慢慢研究了。

Dynamic Proxy的异常处理

现在越来越感觉Dynamic Proxy是个好东西,不过发现异常处理还是得注意下,因为调用实际的代码返回的异常都会被包一次成为InvocationTargetException,所以如果你想让原本的异常继续往上抛,那么必须捕获异常并且得到targetException然后再抛出去:
        try {
            result = targetMethod.invoke(targetObject, args);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("IllegalAccessException", e);
        } catch (IllegalArgumentException e) {
            throw new RuntimeException("IllegalArgumentException", e);
        } catch (InvocationTargetException e) {
            throw e.getTargetException();
        }

扬州之行

又陪老婆来扬州了,还好这次不像上次那样感冒了,但是动车组的空调开得挺大,差点就感冒了。老婆延续了她一贯的迟到风格,连这种考试也是照迟到不误。另外,本来订的是另外一个宾馆,但是她到了地方发现有个速8酒店,为了省点钱,她在已经迟到的情况下还在外面等着给我打电话,而我当时正在付钱,就差在发票上签字了。我都不好意思跟人家服务员说不订了,把电话给了服务员让她说。而且更加尴尬的是我在那个宾馆的大堂看了一个多小时的电影等她考完试再去速8酒店。最终的结果不上次好,由于不是旅游旺季,空房间很多,最后比住那个酒店便宜70块。

由于没有感冒,这次去吃正宗的那个扬州炒饭感觉很好吃,点了两份扬州炒饭,一个榨菜肉丝汤,两个人吃得干干净净,最后老婆把汤全喝了,这次扬州之行应该还不错

手机里面的联系人全没了

前几天说了自己的手机修过,但是一高兴,把这个事情给忘了,就是修完以后联系人里面的人全部没有了,而我的联系人是存在手机上的而不是SIM卡里面的,这下麻烦大了一些可以通过MSN联系的还好说,主要是家里那边的,唉,上个月就没有给家里打电话。

暂时风平浪静

那天写的邮件发挥了应有的作用,美国的架构师暂时接受了我的方案,因为目前的进度快于他的预期,所以他也就不能说太多,但是项目经理跟我说他还是很不高兴,昨天本来应该有个例行的会议也被他取消了。管不了这么多了,也许是我太冲了,太不给他面子了,但是我实在是无法忍受一遍一遍的做重复的事情,那样的话我宁愿换个工作。今天出去吃饭,大家也说了下目前中国的研发中心和美国那边的关系有点紧张,而且开发的主要工作都在逐步往中国转移,中国这边的BOSS也是公司的SVP,他也希望我们能够掌握主导,不过这个总归是个问题。

闯祸了

呵呵,今天BOSS回来了,竟然为了我们那个项目的事情到我们的Cube和我们简单了说了下,而另外一个BOSS也和美国那边的架构师以及项目经理开了个电话会议,然后我们的项目经理到我们这里仔细的问了下情况,说美国的架构师很生气,我猜想是因为我没有使用那个架构师的设计,我跟项目经理谈了我为什么要那么修改,他转而支持我,只要BOSS同意,然后又和BOSS谈了下,他只谈及了项目的目标,并不关注实现的细节,而且他说美国的架构师也只是因为担心我们把太多的精力花在搭建Framework上而不能完成原来的目标,而如果不能完成目标,他很可能会失业,而我们不会有影响。不管架构师到底担心什么,我还是写了封信解释我为什么那么做,以及现在取得的成果,而且跟他保证我们在下周就可以完成大部分代码,希望在明天早上的会议上他能够同意我的方案,希望他真的不是因为我们不用他的设计才生气的,否则结果很难讲。

打开SSL后Apache的日志的问题

帮别人做apache+Tomcat的集群,另外只能对外开放SSL端口,所以用OpenSSL做了SSL的配置,然后我想看看他们的Access.log,但是修改配置后无效,后来发现是httpd-ssl.conf中的配置会覆盖httpd.conf中的配置,查了下apache的手册,发现原来虚拟主机的配置会覆盖系统的配置,而SSL的配置就是利用虚拟主机配置的,问题解决。

PS:apache2.2新增了一个很好的特点,就是SetEnvIf,可以设计Access.log中只纪录某些类型的访问,对于我们而言,主要关注的就是动态的内容,静态的内容不仅多,而且我们一般都不太关注,所以这样配置下就可以只纪录.do的请求:

SetEnvIf Request_URI "\.do" is_action
CustomLog logs/access.log common  env=is_action

面试Data Architect

呵呵,不是我应聘而是面试应聘我们公司这个职位的人,已经面了不少人了,没有一个觉得还可以的,最开始是一个留美的女博士,数据库DBA的经验太少,而且她倾向于做交流方面的工作,而不是侧重于技术,好发挥她的英语口语的优势,后来面试的几个要么基本上就是做一些 数据库维护,没有系统的数据库设计的经验,要么基本上就没有接触过SQL Server服务器,也不倾向于做SQL Server的DBA相关的工作,呵呵,难啊。

增加一个方法要修改多少个地方?

被调到新的项目组,理论上算个Team Leader,没有真正的转正,老大最开始跟我说这边的事情我可以做主,但是美国那边有个架构师开始搭了个架子,意思是在这个架子的基础上做,试了下,发现很繁琐,为了增加一个方法,得修改好多个类。这个阶段其实是个过渡阶段,以后我们会使用Web Service,所以我们哟定义Web Service的接口,然后因为是过渡阶段,所以提供了EJB2的过渡方案和原来的系统整合,所以还得改Remote接口,Local接口可以直接从Service接口extends一下就行了,然后得修改Service的实现类,加上原先的架子里面,设计的是Service里面的每个public方法对应一个Operation类,这些类设计成Command模式,方便以后可以更好的进行负载的Dispatch,就这样,给Service增加一个接口,要完全实现得至少修改3个类,增加一个类,而且前两天也提过这个项目使用的Annotation的一个好处,但是这样一来,我要实现那个接口,也得在Finder里面增加方法。最终,我得修改4个类,增加一个类来增加一个Service接口。天啊,这个是我最讨厌的。

下周打算修改这个架子,取消EJB2的临时方案,使用Dynamic Proxy实现Service,同时可以引人Transaction(这个方案原来也用了,但是架构师以Transaction的问题否决了,那个时候还没有想到怎么解决Transaction的问题,前天突然想起来我的EJB单元测试框架就是用的自定义Transaction的),同时也抛弃Finder的那个方案,因为其实我的BaseOperation已经提供了进行Hibernate的查询的方便的基础功能。最重要的是Finder中定义的Query如果有问题的话修改后不能Hot Deploy,如果在Operation的方法体里面的修改就可以Hot Deploy。这样修改后,增加一个接口只需要修改Service然后增加一个Operation类实现就行了,只要改两个地方。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑