为什么jersey2服务在tomcat中部署没有错误,但无法访问资源?

时间:2014-04-11 21:43:26

标签: java rest jersey

我的pom:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>    
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.7</version>
</dependency>    
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.7</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.7</version>
</dependency>

的web.xml

<web-app>
  <display-name>jerseysample</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.adaequare.rest.config.JerseyResourceInitializer</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>
</web-app>

我的resourceonfig实现:

package com.adaequare.rest.config;

import org.glassfish.jersey.server.ResourceConfig;

public class JerseyResourceInitializer extends ResourceConfig {
    public JerseyResourceInitializer() {
        packages(true, "com.adaequare.resource");
    }
}

我的资源:

package com.adaequare.resource;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class Hello {
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello(){
        return "<html><title>Hello Jersey</title><body><h1>Hello Jersey</h1></body></html>";
    }

    @GET
    @Path("/text")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello() {
        return "Hello Jersey";
    }

    // This method is called if XML is request
    @GET
    @Path("/xml")
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
    }

@GET
@Path("/text")
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
    return "Hello Jersey";
}

}

我正在使用&#34;动态网络模块&#34;项目方面和Tomcat 7的3.0版和Java 1.7版。 应用程序部署(成功?)没有任何错误,因为我看到默认的jsp页面,但当我转到以下任何一个时:

http://localhost:8080/myproject/rest/hello
http://localhost:8080/myproject/rest/hello/sample
http://localhost:8080/myproject/rest/hello/text
http://localhost:8080/myproject/rest/hello/xml

我得到了404.什么阻止我的资源类正确返回?我错过了什么或有什么不对吗?该项目在eclipse kepler中没有显示任何错误。

部署程序集是:

/src/main/java
/src/main/resources
/src/main/webapp
/target/m2e-wtp/web-resources
Maven Dependencies

2 个答案:

答案 0 :(得分:1)

我刚刚测试过您的资源,并且没有任何问题。

我没有看到你在扩展ResourceConfig并将其作为init-param使用时会受益匪浅(你当然可以比这个例子做得更多)。

我会废弃该内容,只需将以下内容添加为唯一直接提取init-param的{​​{1}}。

Resource

(您也可以使用&#34; jersey.config.server.provider.packages&#34;如果您愿意,请指定包名称)

此外,我总是发现通过mbeans启用的Jersey monitoring statistics确实有助于确定我的资源是否已正确部署。为此,添加以下<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>com.adaequare.resource.Hello</param-value> </init-param> ,启动jconsole(在java / bin目录中)并连接到流程 - jersey提供了有关已部署资源的大量信息

init-param

最后,请参阅this以获取使用Jetty的示例(此测试服务器是我插入您的资源以进行测试的地方)

答案 1 :(得分:0)

我对Jersy并不熟悉,但似乎问题是你只在类级别上映射/你好,因此它无法确定需要调用哪种方法。因此,你得到了404。

尝试类似:

@Path("/hello")
public class Hello {

    @GET
    @Path("/html")
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello(){
        return "<html><title>Hello Jersey</title><body><h1>Hello Jersey</h1></body></html>";
    }

    @GET
    @Path("/text")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello() {
        return "Hello Jersey";
    }

    // This method is called if XML is request
    @GET
    @Path("/xml")
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
    }

}

并查看例如http://localhost:8080/myproject/rest/hello/xml是否有效。