1

我正在使用以下技术开发一些 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 文件然后导航到 urlhttp://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 文件并导航到同一个 urlhttp://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 将压缩后的 war 文件的内容提取到一个文件夹中,然后使用 Beyond Compare 将原始爆炸战争与刚刚提取的上下文进行文件夹比较,它们是相同的。

这让我相信 jboss 如何部署爆炸战争与压缩战争文件有一些独特之处,但我不明白这可能是什么或为什么它会这样。任何人都可以帮助或指出我的新方向吗?

虽然一个简单的响应可能没问题,只需部署分解的 war 文件,我想了解为什么会发生这种情况并继续使用我现有的 build.xml 生成压缩的 .war 文件。

4

2 回答 2

0
<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;
    }
}
于 2014-04-15T14:58:03.523 回答
0

你可以试试这个:

public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(HelloWorldResource.class);
        return s;
    }
}

或泽西文档中的其他示例,如果您想使用反射来获取资源。

您可能会遇到解包战争干扰球衣自动扫描过程的情况,这应该可以解决它。

于 2013-12-04T21:57:45.883 回答