Gangmax Blog

My Tip 50

昨天,当我试图把unavailabeCIs这部分功能加入到Michael的ReportDataService project时,遇到一个问题:在Jersey和Spring一起使用的时候,Jersey class中原本应该由Spring注入的beans都没有正常注入,运行时会发生NullPointException。但是当application server启动时,从系统日志可以看出,Spring明明是正常地初始化了那些beans的,百思不得其解。

今天继续探究问题,找到了两个错误的原因:

  1. 在Jersey中集成Spring,主要是依靠在web.xml中配置这样一个servlet:
1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>
<servlet-name>JerseySpringServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.sun.itsp.report.resources;com.sun.itsp.report.unavailablecis.rest</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>JerseySpringServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
注意"<param-value>"标签中的参数"com.sun.itsp.report.resources;com.sun.itsp.report.unavailablecis.rest",这个参数的意思是:告知该servlet当前系统中所有声明为RESTful classes所在的包位置。这样,Spring就知道该到哪里去注入beans(我猜)。问题在于:我和Michael的代码各有一个包,这里需要配置两个包位置。昨天我想当然地用","分隔,今天查了资料(javadoc of "com.sun.jersey.spi.container.servlet.ServletContainer" class),发现应该使用";"来分隔。
  1. 在原来的web.xml中除了上面的servlet之外,还有一个servlet:
1
2
3
4
5
6
7
8
9
10
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>ServletAdaptor</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
这个servlet应该是当Michael在Netbeans中创建一个RESTful web service时,由Netbeans自动创建的。该servlet的功能是把所有的RESTful请求集中由该servlet来处理。

问题就处在这里:昨天我测试的时候,都是使用“/resources/xxx”的URL来请求。今天我改为直接使用"/xxx"来请求,问题就解决了!

问题的关键在于:只有当配置了使用SpringServlet来处理REST请求时,Spring才会正常的工作,如果使用ServletAdaptor来处理REST请求,那么Spring就没有被引入,当然相应的Spring beans也没有被正常的注入了。

最后删除ServletAdaptor servlet,因为它已经没有用了。

Add Spring test jar file

Add you JUNit test cases code;

Add the cobertura jars;

Add ant task which will run the cobertura coverage test;

Cofigure the Hudson to add the “test” target, which will invoke the cobertura coverage test.

Comments