0

我正在尝试制作一个小型 jax-rs 演示。

我有这个资源类:

@Path("/cart")
public class ShoppingCartResource {

    @EJB
    private ShoppingCartService shoppingCartService;

    @GET
    public String getCart() {
        ShoppingCart cart = shoppingCartService.getCart();
        return "cart with "+cart.getProducts().size()+" items";
    }
}

这个类被打包在一个名为 rest-1.0-SNAPSHOT.war 的 *.war 中,它本身在一个名为 ear-1.0-SNAPSHOT.ear 的 *.ear 中,我放置在 jboss 7.1.3 的 /deployments 目录中

我的 web.xml 是空的:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
</web-app>

我的application.xml(在耳朵里)是由maven自动生成的:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
  <display-name>ear</display-name>
  <module>
    <ejb>services-impl-1.0-SNAPSHOT.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>rest-1.0-SNAPSHOT.war</web-uri>
      <context-root>/rest</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

当我启动 jboss 时,它开始了我的战争,从日志中可以看出:

09:52:19,392 INFO  [org.jboss.web] (MSC service thread 1-4) JBAS018210: Registering web context: /rest
09:52:19,401 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 28) JBAS018559: Deployed "ear-1.0-SNAPSHOT.ear"

但无论我尝试什么网址,我都无法访问此资源。我试过了:

  1. 本地主机:8080/休息/购物车
  2. 本地主机:8080/ear-1.0-SNAPSHOT/rest/cart

我不断收到 404。资源绑定在哪里,或者如果它没有真正绑定,我做错了什么?

4

2 回答 2

1

显然,有一种合法(符合规范)的方式来部署 jax-rs 资源而无需 servlet/filter 映射,如此处的 jax-rs 文档中所述(该部分说as7,但它实际上适用于任何符合 Java EE 6 的 AS)。

解决方案是有一个空的 web.xml,然后包含一个 Application 类,注释为@ApplicationPath

@ApplicationPath("/root-path")
public class MyApplication extends Application
{
}
于 2013-06-16T06:16:17.350 回答
0

JAX-RS 应用程序需要web.xml中的配置部分来正确设置管理休息调用的 servlet。在web.xml中创建一个部分,如下所示:

<servlet>
    <servlet-name>JerseyRestService</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>...</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>JerseyRestService</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

servlet部分中的 init 参数应包括包含其余类的包。url-pattern参数可以更改为您喜欢的 url 前缀。

于 2013-05-14T09:12:04.567 回答