Jboss 5,Jersey 2.4,压缩.war文件不起作用



我正在使用以下技术开发一些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;
    }
}

最新更新