我正在使用以下技术开发一些RESTful Web服务
* Java 1.7
* Jersey 2.4.1
* spring 3.2.1
* Jboss-5.1.0.GA
到目前为止,我已经使用eclipse构建了war文件,包括分解版本和压缩版本。我已经一次一个地将文件复制到{jboss-home}/server/web/deploy
,并通过运行run.bat -c web
使用命令行启动服务器。在这两种情况下,服务器启动时都没有出现错误,并且日志文件完全相同。(不包括时间戳)
当我部署分解的war文件,然后导航到url http://mydomain.com:8080/{app}/rest/application.wadl
时,jersey正确地识别了带注释的资源,我可以按预期使用它们。
球衣注释
@Path("/v1/ping")
@Service("pingV1")
public class PingV1 extends BaseResource {
@Autowired
private PingBusiness pingBusiness;
@GET
@Produces(MediaType.APPLICATION_XML)
public PingVO getPing(
@Context UriInfo uriInfo,
@Context HttpServletRequest httpServletRequest){
...
PingVO pingVO = pingBusiness.doGet();
...
return pingVO;
}
}
application.wadl(动态生成)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.4.1 2013-11-08 12:08:47"/>
<grammars>
<include href="application.wadl/xsd0.xsd">
<doc xml:lang="en" title="Generated"/>
</include>
</grammars>
<resources base="http://mydomain.com:8080/{app}/rest/">
<resource path="/v1/ping">...</resource>
<resource path="/">...</resource>
<resource path="application.wadl">...</resource>
</resources>
</application>
然而,当我将压缩的.war文件和导航部署到同一个url http://mydomain.com:8080/{app}/rest/application.wadl
时,它找不到带注释的资源,当我到达预期的url时,jboss返回404-not FOUND。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.4.1 2013-11-08 12:08:47"/>
<grammars/>
<resources base="http://mydomain.com:8080/{app}/rest/">
<resource path="application.wadl">...</resource>
</resources>
</application>
最后,我使用winRAR将压缩战争文件的内容提取到一个文件夹中,然后使用Beyond Compare将原始爆炸战争与刚刚提取的上下文进行文件夹比较,这些上下文是相同的。
这让我相信jboss部署爆炸战争与压缩战争文件的方式有一些独特之处,但我不明白这可能是什么,也不明白它为什么会这样。有人能帮助我或为我指明一个新的方向吗?
虽然一个简单的响应可以是好的,那么只需部署分解的war文件,我想了解为什么会发生这种情况,并继续使用我现有的build.xml,它生成压缩的.war文件。
你可以试试这个:
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(HelloWorldResource.class);
return s;
}
}
或者Jersey文档中的其他示例(如果您想使用反射来获取资源)。
你可能有一种情况,战争的开箱干扰了球衣自动扫描过程,这应该可以解决它。
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.xyz.app.rest.MyApplication</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.xyz.app.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
package com.xyz.app.rest;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(MyDataResource.class);
return s;
}
}